Apel sistem de furcă în C

Fork System Call C



apelul de sistem fork () este utilizat pentru a crea procese copil într-un program C. fork () este utilizat acolo unde este necesară procesarea paralelă în aplicația dvs. Funcția de sistem fork () este definită în anteturi sys / types.h și unistd.h . Într-un program în care utilizați furculiță, trebuie să utilizați și apelul de sistem wait (). wait () apel de sistem este folosit pentru a aștepta în procesul părinte până la finalizarea procesului copil. Pentru a finaliza un proces copil, apelul de sistem exit () este utilizat în procesul copil. Funcția wait () este definită în antet sys / wait.h iar funcția exit () este definită în antet stdlib.h .

Fig 1: Fluxul de lucru de furcă de bază ()

Fig 1: Fluxul de lucru de furcă de bază ()







În acest articol, vă voi arăta cum să utilizați apelul de sistem fork () pentru a crea procese copil în C. Deci, să începem.



fork () Sintaxă și valoare de returnare:

Sintaxa funcției de sistem fork () este după cum urmează:



pid_t furculiță(nul);

Funcția de sistem fork () nu acceptă niciun argument. Returnează un număr întreg de tip pid_t .





La succes, fork () returnează PID-ul procesului copil care este mai mare de 0. În interiorul procesului copil, valoarea returnată este 0. Dacă fork () eșuează, atunci returnează -1.

Furcă simplă () Exemplu:

Un exemplu simplu de furcă () este dat mai jos:



#include
#include
#include
#include
#include

intprincipal(nul) {
pid_t pid=furculiţă();

dacă(pid== 0) {
printf ('Copil => PPID:% d PID:% d n',înfiorat(),obraznic());
Ieșire (EXIT_SUCCESS);
}
altceva dacă(pid> 0) {
printf ('Parent => PID:% d n',obraznic());
printf („Așteptăm terminarea procesului copilului. n');
aștepta(NUL);
printf („Procesul copil s-a încheiat. n');
}
altceva {
printf („Imposibil de creat procesul copil. n');
}

întoarcereEXIT_SUCCESS;
}

Aici, am folosit fork () pentru a crea un proces copil din procesul principal / părinte. Apoi, am imprimat PID (ID proces) și PPID (ID proces părinte) din procesul copil și părinte. În procesul părinte wait (NULL) este utilizat pentru a aștepta finalizarea procesului copil. În procesul copil, exit () este utilizat pentru a finaliza procesul copil. După cum puteți vedea, PID al procesului părinte este PPID al procesului copil. Deci, procesul copilului 24738 aparține procesului părinte 24731 .

De asemenea, puteți utiliza funcții pentru a vă face programul mai modular. Aici, am folosit processTask () și parentTask () funcții pentru copil și respectiv procesele părintești. Așa se folosește de fapt fork ().

#include
#include
#include
#include
#include

nulchildTask() {
printf ('Salut Lume n');
}

nulparentTask() {
printf ('Sarcina principala. n');
}

intprincipal(nul) {
pid_t pid=furculiţă();

dacă(pid== 0) {
childTask();
Ieșire (EXIT_SUCCESS);
}
altceva dacă(pid> 0) {
aștepta(NUL);
parentTask();
}
altceva {
printf („Imposibil de creat procesul copil.”);
}

întoarcereEXIT_SUCCESS;
}

Ieșirea programului de mai sus:

Rularea mai multor procese copil folosind furca () și Loop:

De asemenea, puteți utiliza bucla pentru a crea cât mai multe procese copil de care aveți nevoie. În exemplul de mai jos, am creat 5 procese copil folosind for loop. De asemenea, am tipărit PID și PPID din procesele copil.

#include
#include
#include
#include
#include

intprincipal(nul) {
pentru(inteu= 1;eu<= 5;eu++) {
pid_t pid=furculiţă();

dacă(pid== 0) {
printf („Proces copil => PPID =% d, PID =% d n',înfiorat(),obraznic());
Ieșire (0);
}
altceva {
printf ('Proces părinte => PID =% d n',obraznic());
printf („Se așteaptă finalizarea proceselor copilului ... n');
aștepta(NUL);
printf ('procesul copil s-a terminat. n');
}
}

întoarcereEXIT_SUCCESS;
}

După cum puteți vedea, ID-ul procesului părinte este același în toate procesele copil. Deci, toți aparțin aceluiași părinte. De asemenea, ei execută în mod liniar. Unul dupa altul. Controlul proceselor copil este o sarcină sofisticată. Dacă aflați mai multe despre programarea sistemului Linux și cum funcționează, veți putea controla fluxul acestor procese oricum doriți.

Exemplu de viață reală:

Diferite calcule matematice complexe, cum ar fi generarea hash md5, sha256 etc. necesită multă putere de procesare. În loc să calculați astfel de lucruri în același proces ca și programul principal, puteți calcula hash-ul unui proces secundar și readuce hash-ul la procesul principal.

În exemplul următor, am generat un cod PIN din 4 cifre într-un proces copil și l-am trimis procesului părinte, programul principal. Apoi, am imprimat codul PIN de acolo.

#include
#include
#include
#include
#include

intgetPIN() {
// utilizați PPID și PID ca semințe
srand (obraznic() +înfiorat());
intsecret= 1000 + rand () % 9000;
întoarceresecret;
}

intprincipal(nul) {
intfd[2];
conductă(fd);
pid_t pid=furculiţă();

dacă(pid> 0) {
închide(0);
închide(fd[1]);
dup(fd[0]);

intnumăr secret;
mărime_treadBytes=citit(fd[0], &număr secret, mărimea(număr secret));

printf („Aștept codul PIN ... n');
aștepta(NUL);
printf ('Octeți citiți:% ld n',readBytes);
printf ('PIN:% d n',număr secret);
}
altceva dacă(pid== 0) {
închide(1);
închide(fd[0]);
dup(fd[1]);

intsecret=getPIN();
scrie(fd[1], &secret, mărimea(secret));
Ieșire (EXIT_SUCCESS);
}

întoarcereEXIT_SUCCESS;
}

După cum puteți vedea, de fiecare dată când rulez programul, primesc un cod PIN diferit de 4 cifre.

Deci, în esență, așa utilizați apelul de sistem fork () în Linux. Vă mulțumim că ați citit acest articol.