Fork sistemski poziv u C

Fork System Call C

fork () sistemski poziv koristi se za stvaranje podređenih procesa u C programu. fork () se koristi tamo gdje je u vašoj aplikaciji potrebna paralelna obrada. Sistemska funkcija fork () definirana je u zaglavljima sys/vrste.h i unistd.h . U programu u kojem koristite fork morate koristiti i wait () sistemski poziv. Sistemski poziv wait () koristi se za čekanje u roditeljskom procesu na završetak podređenog procesa. Za dovršetak podređenog procesa, izlazni () sistemski poziv koristi se u podređenom procesu. Funkcija wait () definirana je u zaglavlju sys/wait.h a funkcija exit () definirana je u zaglavlju stdlib.h .

Slika 1: Osnovni tijek rada vilice ()

Slika 1: Osnovni tijek rada vilice ()



U ovom članku ću vam pokazati kako koristiti sistemski poziv fork () za stvaranje podređenih procesa u C. Dakle, krenimo.



fork () Sintaksa i povratna vrijednost:

Sintaksa funkcije sustava fork () je sljedeća:



pid_t vilica(poništiti);

Sustavna funkcija fork () ne prihvaća nijedan argument. Vraća cijeli broj tipa pid_t .

Uspješno, fork () vraća PID podređenog procesa koji je veći od 0. Unutar podređenog procesa, povratna vrijednost je 0. Ako fork () ne uspije, onda vraća -1.

Primjer jednostavne vilice ():

Primjer jednostavne vilice () dat je u nastavku:



#uključi
#uključi
#uključi
#uključi
#uključi

intglavni(poništiti) {
pid_t pid=vilica();

ako(pid== 0) {
printf ('Dijete => PPID: %d PID: %d n',getppid(),getpid());
Izlaz (EXIT_SUCCESS);
}
drugo ako(pid> 0) {
printf ('Roditelj => PID: %d n',getpid());
printf ('Čeka se da se proces djeteta završi. n');
čekati(NULL);
printf ('Dječji proces dovršen. n');
}
drugo {
printf ('Nije moguće stvoriti podređeni proces. n');
}

povratakEXIT_SUCCESS;
}

Ovdje sam koristio fork () za stvaranje podređenog procesa od glavnog/roditeljskog procesa. Zatim sam ispisao PID (ID procesa) i PPID (ID roditeljskog procesa) iz podređenog i roditeljskog procesa. Na roditeljskom procesu čekanje (NULL) koristi se za čekanje da se podređeni proces završi. Na podređenom procesu izlaz () se koristi za dovršetak podređenog procesa. Kao što vidite, PID nadređenog procesa je PPID podređenog procesa. Dakle, dječji proces 24738 pripada roditeljskom procesu 24731 .

Također možete koristiti funkcije kako biste svoj program učinili modularnijim. Evo, koristio sam processTask () i parentTask () funkcije za dijete i roditeljske procese. Ovako se zapravo koristi fork ().

#uključi
#uključi
#uključi
#uključi
#uključi

poništitichildTask() {
printf ('Pozdrav svijete n');
}

poništitiparentTask() {
printf ('Glavni zadatak. n');
}

intglavni(poništiti) {
pid_t pid=vilica();

ako(pid== 0) {
childTask();
Izlaz (EXIT_SUCCESS);
}
drugo ako(pid> 0) {
čekati(NULL);
parentTask();
}
drugo {
printf ('Nije moguće stvoriti podređeni proces.');
}

povratakEXIT_SUCCESS;
}

Ishod gornjeg programa:

Pokretanje više podređenih procesa pomoću fork () i petlje:

Također možete koristiti petlju za stvaranje što više podređenih procesa. U donjem primjeru stvorio sam 5 podređenih procesa pomoću for petlje. Također sam ispisao PID i PPID iz podređenih procesa.

#uključi
#uključi
#uključi
#uključi
#uključi

intglavni(poništiti) {
za(inti= 1;i<= 5;i++) {
pid_t pid=vilica();

ako(pid== 0) {
printf ('Podređeni proces => PPID =%d, PID =%d n',getppid(),getpid());
Izlaz (0);
}
drugo {
printf ('Roditeljski proces => PID =%d n',getpid());
printf ('Čekanje da se dovrše procesi djece ... n');
čekati(NULL);
printf ('dječji proces dovršen. n');
}
}

povratakEXIT_SUCCESS;
}

Kao što vidite, ID roditeljskog procesa isti je u svim podređenim procesima. Dakle, svi oni pripadaju istom roditelju. Također se izvode linearno. Jedna poslije druge. Kontrola dječjih procesa sofisticiran je zadatak. Ako naučite više o programiranju Linux sustava i kako on funkcionira, moći ćete kontrolirati tijek ovih procesa kako god želite.

Primjer iz stvarnog života:

Različita složena matematička izračunavanja, poput md5, sha256 itd. Generiranja raspršivanja, zahtijevaju mnogo procesorske snage. Umjesto da takve stvari računate u istom procesu kao i glavni program, možete jednostavno izračunati raspršivanje na podređenom procesu i vratiti raspršivanje u glavni proces.

U sljedećem primjeru generirao sam 4-znamenkasti PIN kôd u podređenom procesu i poslao ga roditeljskom procesu, glavnom programu. Zatim sam odatle ispisao PIN kôd.

#uključi
#uključi
#uključi
#uključi
#uključi

intgetPIN() {
// koristiti PPID i PID kao sjeme
srand (getpid() +getppid());
inttajna= 1000 + red () % 9000;
povrataktajna;
}

intglavni(poništiti) {
intF D[2];
cijev(F D);
pid_t pid=vilica();

ako(pid> 0) {
Zatvoriti(0);
Zatvoriti(F D[1]);
nakon(F D[0]);

inttajniBroj;
veličina_treadBytes=čitati(F D[0], &tajniBroj, veličina(tajniBroj));

printf ('Čekanje PIN -a ... n');
čekati(NULL);
printf ('Očitani bajti: %ld n',readBytes);
printf ('PIN: %d n',tajniBroj);
}
drugo ako(pid== 0) {
Zatvoriti(1);
Zatvoriti(F D[0]);
nakon(F D[1]);

inttajna=getPIN();
pisati(F D[1], &tajna, veličina(tajna));
Izlaz (EXIT_SUCCESS);
}

povratakEXIT_SUCCESS;
}

Kao što vidite, svaki put kad pokrenem program, dobijem drugačiji 4-znamenkasti PIN kôd.

Dakle, u osnovi tako koristite sistemski poziv fork () u Linuxu. Hvala što ste pročitali ovaj članak.