C Programovanie

Systémové volanie vidlice v C

Systémové volanie vidlice v C
Systémové volanie fork () sa používa na vytvorenie podradených procesov v programe C. vidlica () sa používa tam, kde je vo vašej aplikácii požadované paralelné spracovanie. Funkcia systému fork () je definovaná v hlavičkách sys / typy.h a unistd.h. V programe, kde používate vidličku, musíte použiť aj systémové volanie wait (). Systémové volanie wait () sa používa na čakanie v nadradenom procese na dokončenie podradeného procesu. Na dokončenie podradeného procesu sa v podradenom procese použije systémové volanie exit (). Funkcia wait () je definovaná v hlavičke sys / počkaj.h a funkcia exit () je definovaná v hlavičke stdlib.h.

Obrázok 1: Pracovný tok základnej vidlice ()

V tomto článku vám ukážem, ako používať systémové volanie fork () na vytvorenie podradených procesov v jazyku C. Takže poďme na to.

fork () Syntax a návratová hodnota:

Syntax systémovej funkcie fork () je nasledovná:

pid_t fork (void);

Funkcia systému fork () neprijíma žiadny argument. Vráti celé číslo typu pid_t.

Pri úspechu fork () vráti PID podradeného procesu, ktorý je väčší ako 0. Vo vnútri podradeného procesu je návratová hodnota 0. Ak fork () zlyhá, vráti -1.

Simple fork () Príklad:

Jednoduchý príklad vidlice () je uvedený nižšie:

#include
#include
#include
#include
#include
 
int main (void)
pid_t pid = vidlica ();
 
if (pid == 0)
printf ("Dieťa => PPID:% d PID:% d \ n", getppid (), getpid ());
výstup (EXIT_SUCCESS);

else if (pid> 0)
printf ("Rodič => PID:% d \ n", getpid ());
printf ("Čaká sa na ukončenie podradeného procesu.\ n ");
počkaj (NULL);
printf ("Podradený proces dokončený.\ n ");

else
printf ("Nie je možné vytvoriť podradený proces.\ n ");

 
návrat EXIT_SUCCESS;

Tu som pomocou fork () vytvoril podradený proces z hlavného / nadradeného procesu. Potom som z podradeného a vytlačeného procesu vytlačil PID (ID procesu) a PPID (ID rodiča procesu). Na nadradenom procese sa čaká (NULL) na čakanie na dokončenie podradeného procesu. V podradenom procese sa na ukončenie podradeného procesu používa exit (). Ako vidíte, PID nadradeného procesu je PPID podradeného procesu. Takže, dieťa proces 24738 patrí do nadradeného procesu 24731.

Môžete tiež použiť funkcie, aby bol váš program modulárnejší. Tu som použil processTask () a parentTask () funkcie pre dieťa a rodičov. Takto sa v skutočnosti používa fork ().

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

 
void parentTask ()
printf ("Hlavná úloha.\ n ");

 
int main (void)
pid_t pid = vidlica ();
 
if (pid == 0)
childTask ();
výstup (EXIT_SUCCESS);

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

else
printf ("Nie je možné vytvoriť podradený proces.");

 
návrat EXIT_SUCCESS;

Výstup vyššie uvedeného programu:

Spustenie viacerých podradených procesov pomocou fork () a slučky:

Pomocou slučky môžete tiež vytvoriť toľko podradených procesov, koľko potrebujete. V príklade nižšie som vytvoril 5 podradených procesov pomocou cyklu for. Z podradených procesov som tiež vytlačil PID a PPID.

#include
#include
#include
#include
#include
 
int main (void)
pre (int i = 1; i <= 5; i++)
pid_t pid = vidlica ();
 
if (pid == 0)
printf ("Podradený proces => PPID =% d, PID =% d \ n", getppid (), getpid ());
výstup (0);

else
printf ("Rodičovský proces => PID =% d \ n", getpid ());
printf ("Čaká sa na dokončenie podradených procesov ... \ n");
počkaj (NULL);
printf ("podradený proces dokončený.\ n ");


 
návrat EXIT_SUCCESS;

Ako vidíte, ID nadradeného procesu je rovnaké vo všetkých podradených procesoch. Všetky teda patria tomu istému rodičovi. Vykonávajú tiež lineárnym spôsobom. Jeden za druhým. Ovládanie podradených procesov je sofistikovaná úloha. Ak sa dozviete viac o programovaní systému Linux a o tom, ako to funguje, budete môcť riadiť tok týchto procesov, ako chcete.

Príklad zo skutočného života:

Rôzne zložité matematické výpočty, ako napríklad generovanie hashov md5, sha256 atď., Si vyžadujú veľa výpočtového výkonu. Namiesto toho, aby ste podobné veci počítali v rovnakom procese ako hlavný program, môžete jednoducho vypočítať hodnotu hash pre podradený proces a vrátiť hodnotu hash hlavnému procesu.

V nasledujúcom príklade som vygeneroval 4-ciferný PIN kód v podradenom procese a odoslal ho nadradenému procesu, hlavnému programu. Potom som odtiaľ vytlačil PIN kód.

#include
#include
#include
#include
#include
 
int getPIN ()
// použite PPID a PID ako zárodok
srand (getpid () + getppid ());
int tajne = 1000 + rand ()% 9000;
návratové tajomstvo;

 
int main (void)
int fd [2];
potrubie (fd);
pid_t pid = vidlica ();
 
if (pid> 0)
zavrieť (0);
blízko (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Čaká sa na PIN ... \ n");
počkaj (NULL);
printf ("Čítané bajty:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

else if (pid == 0)
zavrieť (1);
blízko (fd [0]);
dup (fd [1]);
 
int tajne = getPIN ();
write (fd [1], & secret, sizeof (tajné));
výstup (EXIT_SUCCESS);

 
návrat EXIT_SUCCESS;

Ako vidíte, pri každom spustení programu dostanem iný 4-miestny PIN kód.

V podstate teda používate systémové volanie fork () v systéme Linux. Ďakujeme, že ste si prečítali tento článok.

Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
Battle for Wesnoth je jednou z najpopulárnejších open source strategických hier, ktoré si v súčasnosti môžete zahrať. Táto hra bola nielen vyvinutá ve...
Hry 0 A.D. Výukový program
0 A.D. Výukový program
Z mnohých strategických hier je tu 0 A.D. dokáže vyniknúť ako komplexný titul a veľmi hlboká, taktická hra napriek tomu, že je otvoreným zdrojom. Vývo...
Hry Výukový program pre Unity3D
Výukový program pre Unity3D
Úvod do Unity 3D Unity 3D je výkonný nástroj na vývoj hier. Je to multiplatforma, ktorá vám umožňuje vytvárať hry pre mobilné telefóny, web, počítače ...