C Programování

Systémové volání vidlice v C

Systémové volání vidlice v C
Systémové volání fork () se používá k vytvoření podřízených procesů v programu C. fork () se používá tam, kde je ve vaší aplikaci vyžadováno paralelní zpracování. Funkce systému fork () je definována v záhlavích sys / typy.h a unistd.h. V programu, kde používáte vidličku, musíte použít také systémové volání wait (). Systémové volání wait () se používá k čekání v nadřazeném procesu na dokončení podřízeného procesu. K dokončení podřízeného procesu se v podřízeném procesu používá systémové volání exit (). Funkce wait () je definována v záhlaví sys / počkejte.h a funkce exit () je definována v záhlaví stdlib.h.

Obrázek 1: Pracovní postup Basic fork ()

V tomto článku vám ukážu, jak pomocí systémového volání fork () vytvořit podřízené procesy v jazyce C. Pojďme tedy začít.

fork () Syntaxe a návratová hodnota:

Syntaxe funkce systému fork () je následující:

pid_t fork (void);

Funkce systému fork () nepřijímá žádný argument. Vrátí celé číslo typu pid_t.

Při úspěchu vrátí fork () PID podřízeného procesu, který je větší než 0. Uvnitř podřízeného procesu je návratová hodnota 0. Pokud fork () selže, vrátí -1.

Jednoduchá vidlice () Příklad:

Níže je uveden jednoduchý příklad fork ():

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
 
int main (void)
pid_t pid = vidlice ();
 
if (pid == 0)
printf ("Dítě => PPID:% d PID:% d \ n", getppid (), getpid ());
exit (EXIT_SUCCESS);

else if (pid> 0)
printf ("Rodič => PID:% d \ n", getpid ());
printf ("Čekání na dokončení podřízeného procesu.\ n ");
počkat (NULL);
printf ("Podřízený proces dokončen.\ n ");

else
printf ("Nelze vytvořit podřízený proces.\ n ");

 
vrátit EXIT_SUCCESS;

Tady jsem použil fork () k vytvoření podřízeného procesu z hlavního / nadřazeného procesu. Poté jsem z podřízeného a nadřazeného procesu vytiskl PID (ID procesu) a PPID (ID nadřazeného procesu). Na nadřazeném procesu se čekání (NULL) používá k čekání na dokončení podřízeného procesu. V podřízeném procesu se k dokončení podřízeného procesu používá exit (). Jak vidíte, PID nadřazeného procesu je PPID podřízeného procesu. Proces dítěte 24738 patří do nadřazeného procesu 24731.

Můžete také použít funkce, aby byl váš program modulárnější. Tady jsem použil processTask () a parentTask () funkce pro podřízené a rodičovské procesy. Takto se ve skutečnosti používá fork ().

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
 
void childTask ()
printf ("Hello World \ n");

 
void parentTask ()
printf ("Hlavní úkol.\ n ");

 
int main (void)
pid_t pid = vidlice ();
 
if (pid == 0)
childTask ();
exit (EXIT_SUCCESS);

else if (pid> 0)
počkat (NULL);
parentTask ();

else
printf ("Nelze vytvořit podřízený proces.");

 
vrátit EXIT_SUCCESS;

Výstup výše uvedeného programu:

Spuštění více podřízených procesů pomocí fork () a Loop:

Smyčku můžete také použít k vytvoření tolik podřízených procesů, kolik potřebujete. V níže uvedeném příkladu jsem vytvořil 5 podřízených procesů pomocí smyčky for. Také jsem vytiskl PID a PPID z podřízených procesů.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
 
int main (void)
pro (int i = 1; i <= 5; i++)
pid_t pid = vidlice ();
 
if (pid == 0)
printf ("Podřízený proces => PPID =% d, PID =% d \ n", getppid (), getpid ());
exit (0);

else
printf ("Nadřazený proces => PID =% d \ n", getpid ());
printf ("Čekání na dokončení podřízených procesů ... \ n");
počkat (NULL);
printf ("podřízený proces dokončen.\ n ");


 
vrátit EXIT_SUCCESS;

Jak vidíte, ID nadřazeného procesu je ve všech podřízených procesech stejné. Všechny tedy patří stejnému rodiči. Provádějí také lineárně. Jeden po druhém. Řízení podřízených procesů je sofistikovaný úkol. Pokud se dozvíte více o programování systému Linux a o tom, jak to funguje, budete moci řídit tok těchto procesů, jakkoli budete chtít.

Příklad ze skutečného života:

Různé složité matematické výpočty, jako je generování hash md5, sha256 atd., Vyžadují hodně výpočetního výkonu. Místo toho, abyste podobné věci počítali ve stejném procesu jako hlavní program, můžete jen vypočítat hash u podřízeného procesu a vrátit hash do hlavního procesu.

V následujícím příkladu jsem v podřízeném procesu vygeneroval čtyřmístný PIN kód a odeslal ho nadřazenému procesu, hlavnímu programu. Poté jsem odtud vytiskl PIN kód.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
 
int getPIN ()
// použijte PPID a PID jako osivo
srand (getpid () + getppid ());
int secret = 1000 + rand ()% 9000;
návratové tajemství;

 
int main (void)
int fd [2];
trubka (fd);
pid_t pid = vidlice ();
 
if (pid> 0)
zavřít (0);
zavřít (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Čekání na PIN ... \ n");
počkat (NULL);
printf ("Číst bajty:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

else if (pid == 0)
zavřít (1);
zavřít (fd [0]);
dup (fd [1]);
 
int secret = getPIN ();
write (fd [1], & secret, sizeof (secret));
exit (EXIT_SUCCESS);

 
vrátit EXIT_SUCCESS;

Jak vidíte, pokaždé, když spustím program, dostanu jiný 4místný PIN kód.

V zásadě tedy používáte systémové volání fork () v Linuxu. Děkujeme za přečtení tohoto článku.

Hry Porty komerčních her s otevřeným zdrojovým kódem
Porty komerčních her s otevřeným zdrojovým kódem
Zdarma, s otevřeným zdrojovým kódem a multiplatformní herní enginy lze hrát staré i některé z poměrně nedávných herních titulů. Tento článek uvede sez...
Hry Nejlepší hry z příkazového řádku pro Linux
Nejlepší hry z příkazového řádku pro Linux
Příkazový řádek není při používání Linuxu jen vaším největším spojencem - může být také zdrojem zábavy, protože jej můžete použít k hraní mnoha zábavn...
Hry Nejlepší aplikace pro mapování gamepadu pro Linux
Nejlepší aplikace pro mapování gamepadu pro Linux
Pokud rádi hrajete hry na Linuxu s gamepadem místo typického vstupního systému pro klávesnici a myš, máte k dispozici několik užitečných aplikací. Mno...