C Programiranje

Fork sistemski poziv u C

Fork sistemski poziv u C
fork () sistemski poziv koristi se za stvaranje podređenih procesa u programu C. fork () koristi se tamo gdje je u vašoj aplikaciji potrebna paralelna obrada. Funkcija sustava fork () definirana je u zaglavljima sys / vrste.h i unistd.h. U programu u kojem koristite vilicu, također morate koristiti sistemski poziv wait (). sistemski poziv wait () koristi se za čekanje u roditeljskom procesu da se podređeni proces završi. Da bi se dovršio podređeni postupak, koristi se izlazni () sistemski poziv u podređenom procesu. Funkcija wait () definirana je u zaglavlju sys / čekaj.h a funkcija exit () definirana je u zaglavlju stdlib.h.

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.

Pokazivač skače ili se slučajno pomiče dok tipkate u sustavu Windows 10
Ako ustanovite da kursor miša sam skače ili se pomiče automatski, nasumično dok tipkate u Windows prijenosnom računalu ili računalu, neki od ovih prij...
Kako obrnuti smjer pomicanja miša i dodirnih pločica u sustavu Windows 10
Miš i Dodirna pločaRačunarstvo ne samo da olakšava, već i učinkovitije i oduzima puno vremena. Ne možemo zamisliti život bez ovih uređaja, ali činjeni...
Kako promijeniti pokazivač miša i veličinu, boju i shemu pokazivača na sustavu Windows 10
Pokazivač i pokazivač miša u sustavu Windows 10 vrlo su važni aspekti operativnog sustava. To se može reći i za druge operativne sustave, tako da u is...