Systémová volání

Vidlice Systémové volání Linux

Vidlice Systémové volání Linux

Systémové volání vidlice

Systémové volání vidlice 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 jsou prováděny souběžně.

Procesy dítěte a rodiče se ale nacházejí v různých paměťových prostorech. Tyto paměťové prostory mají stejný obsah a jakákoli operace prováděná jedním procesem neovlivní druhý proces.

Když jsou vytvořeny podřízené procesy; nyní oba procesy budou mít stejný programový čítač (PC), takže oba tyto procesy budou směřovat ke stejné další instrukci. Soubory otevřené nadřazeným procesem budou stejné pro podřízený proces.

Podřízený proces je přesně stejný jako jeho rodič, 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 existujících procesů.
  2. ID procesu rodiče bude stejné jako ID procesu rodiče dítěte.

Vlastnosti podřízeného procesu

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

  1. Počítadla CPU a využití prostředků se inicializují, aby se resetovaly na nulu.
  2. Když je nadřazený proces ukončen, podřízené procesy nepřijímají žádný signál, protože atribut PR_SET_PDEATHSIG v prctl () je resetován.
  3. Vlákno použité k volání fork () vytvoří podřízený proces. Adresa podřízeného procesu bude tedy stejná jako adresa rodiče.
  4. Deskriptor souboru nadřazeného procesu je zděděn podřízeným procesem. Například offset souboru nebo stav příznaků a I / O atributy budou sdíleny mezi deskriptory souborů podřízených a nadřazených procesů. Deskriptor souboru nadřazené třídy bude tedy odkazovat na stejný deskriptor souboru podřízené třídy.
  5. Deskriptory fronty otevřených zpráv nadřazeného procesu jsou zděděny podřízeným procesem. Například pokud 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é datové proudy adresáře budou zděděny podřízenými procesy.
  7. Výchozí hodnota uvolnění časovače podřízené třídy je stejná jako aktuální hodnota uvolnění časovače nadřazené třídy.

Vlastnosti, které nezdědí Child proces

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

  1. Paměťové zámky
  2. Signál čekající na vyřízení podřízené třídy je prázdný.
  3. Zpracovat související zámky záznamu (fcntl ())
  4. Asynchronní I / O operace a I / O obsah.
  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

Ve 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 procesy ID jako pid_t je definován v .

Hlavičkový soubor je místo, kde je definována vidlice (), takže ji musíte zahrnout do svého programu, abyste mohli použít vidličku ().

Typ návratu je definován v a volání fork () je definováno v . Abyste mohli používat systémové volání fork (), musíte do svého programu zahrnout obojí.

Syntaxe fork ()

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

pid_t fork (void);

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

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

Fork () nejsou předány žádné argumenty. 

Příklad 1: Volání na vidličku ()

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
int main ()

Vidlička();
printf ("Používání systémového volání fork () \ n");
návrat 0;

VÝSTUP:

Používání systémového volání fork ()
Používání systémového volání fork ()

V tomto programu jsme použili fork (), tím se vytvoří nový podřízený proces. Když je vytvořen podřízený proces, nadřazený proces i podřízený proces budou směřovat na další instrukci (stejný čítač programu). Tímto způsobem budou zbývající instrukce nebo příkazy C provedeny celkový počet časů procesu, tj. 2n krá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) výstup budeme mít dvakrát.

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

Zvažte následující případ, kdy je vidlice () použita 4krát:

KÓD:

#zahrnout
#zahrnout
#zahrnout
int main ()

Vidlička();
Vidlička();
Vidlička();
Vidlička();
printf ("Používání systémového volání fork ()");
návrat 0;

Výstup:

Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání systémového volání fork () Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání Používání vidlice () systémové volání 

Celkový počet vytvořených procesů je nyní 24 = 16 a náš tiskový výpis jsme provedli 16krát.

Příklad 2: Testování, zda byla vidlice () úspěšná

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

KÓD:

#zahrnout
#zahrnout
#zahrnout
int main ()

pid_t p;
p = vidlice ();
pokud (p == - 1)

printf ("Při volání fork () došlo k chybě");

pokud (p == 0)

printf ("Jsme v podřízeném procesu");

jiný

printf ("Jsme v nadřazeném procesu");

návrat 0;

VÝSTUP:

Jsme v rodičovském procesu
Jsme v procesu dítěte

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

p = vidlice ();

Takže celočíselná hodnota vrácená fork () je uložena v p a poté je p porovnáno s kontrolou, zda bylo naše volání fork () úspěšné.

Když se použije volání fork () a podřízené se vytvoří úspěšně, ID podřízeného procesu se vrátí do nadřazeného procesu a 0 se vrátí 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 výukovém programu uvidíte, jak začít se systémovým voláním fork v linuxu.

Hry 5 nejlepších arkádových her pro Linux
5 nejlepších arkádových her pro Linux
V dnešní době jsou počítače vážné stroje používané k hraní her. Pokud nemůžete získat nové vysoké skóre, budete vědět, co tím myslím. V tomto příspěvk...
Hry Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 vydané minulý měsíc, je šestým vývojovým vydáním v 1.13.série x a přináší řadu vylepšení, zejména do uživatelského rozhraní,...
Hry Jak nainstalovat League Of Legends na Ubuntu 14.04
Jak nainstalovat League Of Legends na Ubuntu 14.04
Pokud jste fanouškem League of Legends, pak je to pro vás příležitost otestovat běh League of Legends. Všimněte si, že LOL je podporován na PlayOnLinu...