Î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.