Volání systému Volání Linuxu

Fork System Call Linux



Systémové volání fork se používá k vytvoření nových procesů. Nově vytvořený proces je podřízený proces. Proces, který volá fork a vytváří nový proces, je nadřazený proces. Podřízené a nadřazené procesy se provádějí souběžně.

Podřízené a rodičovské procesy se však nacházejí v různých paměťových prostorech. Tyto paměťové prostory mají stejný obsah a jakákoli operace, kterou provádí jeden proces, neovlivní druhý proces.







Když je vytvořen podřízený proces; nyní budou mít oba procesy stejný programový čítač (PC), takže oba tyto procesy budou ukazovat na stejnou další instrukci. Soubory otevřené rodičovským procesem budou stejné pro podřízený proces.



Podřízený proces je přesně stejný jako jeho nadřazený, ale v ID procesů je rozdíl:



  1. ID procesu podřízeného procesu je jedinečné ID procesu, které se liší od ID všech ostatních stávajících procesů.
  2. ID rodičovského procesu bude stejné jako ID procesu rodiče dítěte.

Vlastnosti podřízeného procesu

Následuje několik vlastností, které podřízený proces uchovává:





  1. Počitadla CPU a využití prostředků se inicializují, aby se resetovaly na nulu.
  2. Když je nadřazený proces ukončen, podřízené procesy neobdrží žádný signál, protože atribut PR_SET_PDEATHSIG v prctl () je resetován.
  3. Vlákno používané k volání fork () vytváří podřízený proces. Adresa podřízeného procesu tedy bude stejná jako adresa rodiče.
  4. Deskriptor souboru nadřazeného procesu je děděn podřízeným procesem. Například ofset souboru nebo stav příznaků a atributy I/O budou sdíleny mezi deskriptory souborů podřízených a nadřazených procesů. Deskriptor souboru nadřazené třídy tedy bude odkazovat na stejný popisovač souborů podřízené třídy.
  5. Otevřené deskriptory fronty zpráv nadřazeného procesu jsou děděny podřízeným procesem. Pokud například deskriptor souboru obsahuje zprávu v nadřazeném procesu, stejná zpráva bude přítomna v odpovídajícím deskriptoru souboru podřízeného procesu. Můžeme tedy říci, že hodnoty příznaků těchto deskriptorů souborů jsou stejné.
  6. Podobně otevřené adresářové toky budou zděděny podřízenými procesy.
  7. Výchozí hodnota vůle časovače podřízené třídy je stejná jako aktuální hodnota vůle časovače nadřazené třídy.

Vlastnosti, které nejsou děděny podřízeným procesem

Níže jsou uvedeny některé z vlastností, které nejsou zděděny podřízeným procesem:

  1. Paměťové zámky
  2. Nevyřízený signál podřízené třídy je prázdný.
  3. Zpracovat související záznamy (fcntl ())
  4. Asynchronní I/O operace a obsah I/O.
  5. Oznámení o změně adresáře.
  6. Časovače jako alarm (), setitimer () nejsou zděděny podřízenou třídou.

vidlice () v C

V fork () nejsou žádné argumenty a návratový typ fork () je celé číslo. Při použití fork () musíte zahrnout následující soubory záhlaví:



#zahrnout
#zahrnout
#zahrnout

Při práci s vidličkou () lze použít pro typ pid_t pro ID procesů je pid_t definován v.

V hlavičkovém souboru je definován fork (), takže jej musíte zahrnout do programu, abyste mohli použít fork ().

Typ návratu je definován v a volání fork () je definováno v. Chcete -li tedy použít systémové volání fork (), musíte do svého programu zahrnout obojí.

Syntaxe fork ()

Syntaxe systémového volání fork () v Linuxu a Ubuntu je následující:

pid_t fork (neplatné);

V syntaxi je návratový typ pid_t . Když je podřízený proces úspěšně vytvořen, PID podřízeného procesu se vrátí v nadřazeném procesu a 0 se vrátí do samotného podřízeného procesu.

Pokud dojde k nějaké chybě, vrátí se do nadřazeného procesu -1 a podřízený proces se nevytvoří.

No arguments are passed to fork(). 

Příklad 1: Calling fork ()

Zvažte následující příklad, ve kterém jsme použili systémové volání fork () k vytvoření nového podřízeného procesu:

KÓD:

#zahrnout
#zahrnout
#zahrnout

inthlavní()
{
Vidlička();
printf („Pomocí systémového volání fork () n');
vrátit se 0;
}

VÝSTUP:

Pomocí systémového volání fork ()
Pomocí systémového volání fork ()

V tomto programu jsme použili fork (), čímž se vytvoří nový podřízený proces. Když je vytvořen podřízený proces, jak nadřazený proces, tak podřízený proces bude ukazovat na další instrukci (stejný programový čítač). Tímto způsobem budou provedeny zbývající instrukce nebo příkazy C z celkového počtu časů procesu, tj. 2nkrát, kde n je počet systémových volání fork ().

Když je tedy volání fork () použito jednou, jak je uvedeno výše (21= 2) budeme mít náš výstup 2krát.

Zde, když je použito systémové volání fork (), bude vnitřní struktura vypadat takto:

Zvažte následující případ, ve kterém se vidlice () používá 4krát:

KÓD:

#zahrnout
#zahrnout
#zahrnout

inthlavní()
{
Vidlička();
Vidlička();
Vidlička();
Vidlička();
printf ('Používání systémového volání fork ()');
vrátit se 0;
}

Výstup:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Nyní je celkový počet vytvořených procesů 24= 16 a naše tiskové prohlášení bylo provedeno 16krát.

Příklad 2: Testování, zda byl fork () úspěšný

V následujícím příkladu jsme použili rozhodovací konstrukci k testování hodnoty (int) vrácené pomocí fork (). A zobrazí se odpovídající zprávy:

KÓD:

#zahrnout
#zahrnout
#zahrnout

inthlavní()
{
pid_t p;
p=Vidlička();
-li(p== -1)
{
printf ('Při volání fork () došlo k chybě');
}
-li(p==0)
{
printf („Jsme v dětském procesu“);
}
jiný
{
printf („Jsme v rodičovském procesu“);
}
vrátit se 0;
}

VÝSTUP:

Jsme v rodičovském procesu
Jsme v dětském procesu

Ve výše uvedeném příkladu jsme použili typ pid_t, který uloží návratovou hodnotu fork (). fork () se nazývá on -line:

p=Vidlička();

Celočíselná hodnota vrácená pomocí fork () je uložena v p a poté je p porovnána, aby se zkontrolovalo, zda bylo naše volání fork () úspěšné.

Když je použito volání fork () a dítě je úspěšně vytvořeno, ID podřízeného procesu bude vráceno nadřazenému procesu a 0 bude vráceno podřízenému procesu. ID podřízeného procesu v nadřazeném procesu nebude stejné jako ID podřízeného procesu v samotném podřízeném procesu. V podřízeném procesu bude ID podřízeného procesu 0.

V tomto tutoriálu uvidíte, jak začít se systémovým voláním fork v linuxu.