C programavimas

Šakių sistemos iškvietimas C

Šakių sistemos iškvietimas C
fork () sistemos iškvietimas naudojamas kuriant antrinius procesus C programoje. šakutė () naudojama ten, kur jūsų programoje reikalingas lygiagretus apdorojimas. Šakės () sistemos funkcija apibrėžta antraštėse sys / tipai.h ir unistd.h. Programoje, kurioje naudojate šakę, taip pat turite naudoti laukimo () sistemos iškvietimą. wait () sistemos iškvietimas naudojamas laukti tėvų procese, kol baigsis vaiko procesas. Norėdami užbaigti vaiko procesą, vaiko procese naudojamas exit () sistemos iškvietimas. Laukimo () funkcija apibrėžta antraštėje sys / laukti.h o išėjimo () funkcija apibrėžta antraštėje stdlib.h.

1 pav. Pagrindinės šakės () darbo eiga

Šiame straipsnyje aš jums parodysiu, kaip naudoti fork () sistemos iškvietimą kuriant vaiko procesus C. Taigi, pradėkime.

šakutė () Sintaksė ir grąžinimo vertė:

„Fork“ () sistemos funkcijos sintaksė yra tokia:

pid_t šakutė (negaliojanti);

„Fork ()“ sistemos funkcija nepriima jokių argumentų. Jis pateikia tipo sveikąjį skaičių pid_t.

Pasisekus, fork () grąžina vaiko proceso PID, kuris yra didesnis nei 0. Vaiko procese grąžinimo vertė yra 0. Jei šakutė () nepavyksta, ji grąžina -1.

Paprasta šakutė () Pavyzdys:

Toliau pateikiamas paprastas šakės () pavyzdys:

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
 
int main (negaliojantis)
pid_t pid = šakutė ();
 
jei (pid == 0)
printf ("Vaikas => PPID:% d PID:% d \ n", getppid (), getpid ());
išėjimas (EXIT_SUCCESS);

dar jei (pid> 0)
printf ("Tėvas => PID:% d \ n", getpid ());
printf ("Laukiama, kol baigsis vaiko procesas.\ n ");
palaukti (NULL);
printf ("Vaiko procesas baigtas.\ n ");

Kitas
printf ("Nepavyko sukurti antrinio proceso.\ n ");

 
grąžinti EXIT_SUCCESS;

Čia aš naudoju šakutę (), norėdamas sukurti vaiko procesą iš pagrindinio / tėvų proceso. Tada atspausdinau PID (proceso ID) ir PPID (pirminio proceso ID) iš vaiko ir tėvų proceso. Tėvų procese laukimas (NULL) naudojamas laukti, kol baigsis vaiko procesas. Vaiko procese išėjimas () naudojamas užbaigti vaiko procesą. Kaip matote, tėvų proceso PID yra vaiko proceso PPID. Taigi, vaiko procesas 24738 priklauso tėvų procesui 24731.

Taip pat galite naudoti funkcijas, kad jūsų programa būtų modulinė. Čia aš naudojau processTask () ir parentTask () funkcijos atitinkamai vaiko ir tėvų procesams. Taip iš tikrųjų naudojamas šakutė ().

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
 
void childTask ()
printf ("Sveikas pasaulis \ n");

 
void parentTask ()
printf ("Pagrindinė užduotis.\ n ");

 
int main (negaliojantis)
pid_t pid = šakutė ();
 
jei (pid == 0)
childTask ();
išėjimas (EXIT_SUCCESS);

dar jei (pid> 0)
palaukti (NULL);
parentTask ();

Kitas
printf ("Nepavyko sukurti antrinio proceso.");

 
grąžinti EXIT_SUCCESS;

Minėtos programos rezultatas:

Kelių vaiko procesų vykdymas naudojant šakę () ir kilpą:

Taip pat galite naudoti ciklą, kad sukurtumėte tiek vaikų procesų, kiek jums reikia. Toliau pateiktame pavyzdyje aš sukūriau 5 vaiko procesus, naudodamas ciklą. Taip pat atspausdinau PID ir PPID iš vaiko procesų.

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
 
int main (negaliojantis)
už (int i = 1; i <= 5; i++)
pid_t pid = šakutė ();
 
jei (pid == 0)
printf ("Vaiko procesas => PPID =% d, PID =% d \ n", getppid (), getpid ());
išėjimas (0);

Kitas
printf ("Tėvų procesas => PID =% d \ n", getpid ());
printf ("Laukiama, kol baigsis vaiko procesai ... \ n");
palaukti (NULL);
printf ("vaiko procesas baigtas.\ n ");


 
grąžinti EXIT_SUCCESS;

Kaip matote, Tėvų proceso ID yra vienodas visuose vaiko procesuose. Taigi, visi jie priklauso tam pačiam tėvui. Jie taip pat vykdo linijiniu būdu. Vienas po kito. Vaiko procesų kontrolė yra sudėtinga užduotis. Jei sužinosite daugiau apie „Linux“ sistemos programavimą ir kaip tai veikia, galėsite bet kuriuo atveju kontroliuoti šių procesų eigą.

Tikrojo gyvenimo pavyzdys:

Skirtingiems sudėtingiems matematiniams skaičiavimams, pvz., Md5, sha256 ir kt. Maišos generavimui, reikia daug apdorojimo galios. Užuot skaičiavę tokius dalykus tame pačiame procese kaip ir pagrindinė programa, galite tiesiog apskaičiuoti vaiko proceso maišos ir grąžinti maišos pagrindinį procesą.

Šiame pavyzdyje aš susikūriau 4 skaitmenų PIN kodą vaiko procese ir išsiunčiau jį pagrindiniam procesui, pagrindinei programai. Tada iš ten atsispausdinau PIN kodą.

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
 
int getPIN ()
// naudoti sėklą PPID ir PID
srand (getpid () + getppid ());
int paslaptis = 1000 + randas ()% 9000;
grįžimo paslaptis;

 
int main (negaliojantis)
int fd [2];
vamzdis (fd);
pid_t pid = šakutė ();
 
jei (pid> 0)
uždaryti (0);
uždaryti (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = skaityti (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Laukiama PIN kodo ... \ n");
palaukti (NULL);
printf ("skaityti baitai:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

dar jei (pid == 0)
uždaryti (1);
uždaryti (fd [0]);
dup (fd [1]);
 
int paslaptis = getPIN ();
rašyti (fd [1], & secret, sizeof (secret));
išėjimas (EXIT_SUCCESS);

 
grąžinti EXIT_SUCCESS;

Kaip matote, kiekvieną kartą paleidus programą gaunu vis kitą 4 skaitmenų PIN kodą.

Taigi iš esmės taip „Linux“ naudojate „fork“ () sistemos iškvietimą. Dėkojame, kad perskaitėte šį straipsnį.

Vidutinis pelės mygtukas neveikia sistemoje „Windows 10“
The vidurinis pelės mygtukas padeda naršyti ilgus tinklalapius ir ekranus, kuriuose yra daug duomenų. Jei tai sustos, gerai, jūs naudosite klaviatūrą ...
Kaip pakeisti kairįjį ir dešinįjį pelės mygtukus „Windows 10“ kompiuteryje
Gana įprasta, kad visi kompiuterio pelės įrenginiai yra ergonomiškai sukurti dešiniarankiams. Tačiau yra pelių prietaisų, specialiai sukurtų kairiaran...
Mėgdžiokite pelės paspaudimus, užveskite pelės žymeklį naudodami pelę „Clickless Mouse“ sistemoje „Windows 10“
Pelės ar klaviatūros naudojimas netinkamoje laikysenoje, kai naudojama per daug, gali sukelti daug sveikatos problemų, įskaitant įtampą, riešo kanalo ...