Slika 1: Osnovni tijek rada vilice ()
U ovom članku pokazat ću vam kako koristiti fork () sistemski poziv za stvaranje podređenih procesa u C-u. Pa, krenimo.
fork () Sintaksa i povratna vrijednost:
Sintaksa funkcije sustava fork () je sljedeća:
pid_t vilica (void);Funkcija sustava fork () ne prihvaća nijedan argument. Vraća cijeli broj tipa pid_t.
Nakon uspjeha, fork () vraća PID podređenog postupka koji je veći od 0. Unutar podređenog postupka, povratna vrijednost je 0. Ako fork () ne uspije, vraća -1.
Jednostavna vilica () Primjer:
Jednostavan primjer fork () dat je u nastavku:
#include#include
#include
#include
#include
int main (void)
pid_t pid = vilica ();
if (pid == 0)
printf ("Dijete => PPID:% d PID:% d \ n", getppid (), getpid ());
izlaz (EXIT_SUCCESS);
inače ako (pid> 0)
printf ("Roditelj => PID:% d \ n", getpid ());
printf ("Čekanje da podređeni postupak završi.\ n ");
pričekati (NULL);
printf ("Podređeni postupak završen.\ n ");
inače
printf ("Nije moguće stvoriti podređeni postupak.\ n ");
povratak EXIT_SUCCESS;
Ovdje sam upotrijebio fork () za stvaranje podređenog procesa iz glavnog / nadređenog procesa. Zatim sam ispisao PID (ID procesa) i PPID (Nadređeni ID procesa) iz podređenog i roditeljskog procesa. Na roditeljskom procesu čekanje (NULL) koristi se za čekanje da se podređeni proces završi. U podređenom procesu, izlaz () se koristi za završetak podređenog postupka. Kao što vidite, PID nadređenog procesa je PPID podređenog procesa. Dakle, dijete proces 24738 pripada nadređenom procesu 24731.
Funkcije možete koristiti i kako biste svoj program učinili modularnijim. Evo, koristio sam processTask () i parentTask () funkcije za dijete i roditelje. Tako se zapravo koristi fork ().
#include#include
#include
#include
#include
void childTask ()
printf ("Pozdrav svijetu \ n");
void parentTask ()
printf ("Glavni zadatak.\ n ");
int main (void)
pid_t pid = vilica ();
if (pid == 0)
childTask ();
izlaz (EXIT_SUCCESS);
inače ako (pid> 0)
pričekati (NULL);
parentTask ();
inače
printf ("Nije moguće stvoriti podređeni postupak.");
povratak EXIT_SUCCESS;
Rezultat gore navedenog programa:
Pokretanje višestrukih podređenih procesa pomoću fork () i Loop:
Također možete koristiti petlju za stvaranje onoliko podređenih procesa koliko vam je potrebno. U donjem primjeru kreirao sam 5 podređenih procesa pomoću for petlje. Također sam tiskao PID i PPID iz podređenih procesa.
#include#include
#include
#include
#include
int main (void)
za (int i = 1; i <= 5; i++)
pid_t pid = vilica ();
if (pid == 0)
printf ("Podređeni postupak => PPID =% d, PID =% d \ n", getppid (), getpid ());
izlaz (0);
inače
printf ("Nadređeni postupak => PID =% d \ n", getpid ());
printf ("Čekanje da podređeni procesi završe ... \ n");
pričekati (NULL);
printf ("podređeni postupak završen.\ n ");
povratak EXIT_SUCCESS;
Kao što vidite, ID nadređenog procesa jednak je u svim podređenim procesima. Dakle, svi oni pripadaju istom roditelju. Također se izvršavaju linearno. Jedna poslije druge. Kontrola dječjih procesa sofisticirani je zadatak. Ako naučite više o programiranju Linux sustava i kako to funkcionira, moći ćete kontrolirati tijek tih procesa kako god želite.
Primjer iz stvarnog života:
Različita složena matematička izračunavanja poput md5, sha256 itd. Generiranje raspršivanja zahtijevaju mnogo procesorske snage. Umjesto da računate takve stvari u istom procesu kao i glavni program, možete samo izračunati hash na podređenom procesu i vratiti hash u glavni proces.
U sljedećem primjeru generirao sam 4-znamenkasti PIN kôd u podređenom procesu i poslao ga nadređenom procesu, glavnom programu. Zatim sam odatle ispisao PIN kod.
#include#include
#include
#include
#include
int getPIN ()
// koristimo PPID i PID kao sjeme
srand (getpid () + getppid ());
int tajna = 1000 + rand ()% 9000;
povratna tajna;
int main (void)
int fd [2];
cijev (fd);
pid_t pid = vilica ();
if (pid> 0)
zatvori (0);
zatvori (fd [1]);
dup (fd [0]);
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Čeka se PIN ... \ n");
pričekati (NULL);
printf ("Pročitano bajtova:% ld \ n", readBytes);
printf ("PIN:% d \ n", tajni broj);
inače ako (pid == 0)
zatvori (1);
zatvori (fd [0]);
dup (fd [1]);
int tajna = getPIN ();
write (fd [1], & secret, sizeof (secret));
izlaz (EXIT_SUCCESS);
povratak EXIT_SUCCESS;
Kao što vidite, svaki put kad pokrenem program, dobijem drugačiji 4-znamenkasti PIN kôd.
Dakle, to je u osnovi način na koji koristite fork () sistemski poziv u Linuxu. Hvala što ste pročitali ovaj članak.