Dakšu sistēmas izsaukums C

Fork System Call C



fork () sistēmas izsaukums tiek izmantots, lai izveidotu C programmas pakārtotus procesus. fork () tiek izmantots, ja jūsu lietojumprogrammā ir nepieciešama paralēla apstrāde. Sistēmas dakša () funkcija ir definēta galvenēs sys/tips.h un unistd.h . Programmā, kurā izmantojat dakšiņu, ir jāizmanto arī gaidīšanas () sistēmas izsaukums. wait () sistēmas izsaukums tiek izmantots, lai vecāku procesā gaidītu bērna procesa pabeigšanu. Lai pabeigtu pakārtoto procesu, bērna procesā tiek izmantots sistēmas iziešanas () izsaukums. Funkcija wait () ir definēta galvenē sys/gaidīt.h un izejas () funkcija ir definēta galvenē stdlib.h .

1. attēls: pamata dakšas () darbplūsma

1. attēls: pamata dakšas () darbplūsma







Šajā rakstā es jums parādīšu, kā izmantot fork () sistēmas izsaukumu, lai izveidotu bērnu procesus C. Tātad, sāksim darbu.



fork () Sintakse un atgriešanās vērtība:

Dakšas () sistēmas funkcijas sintakse ir šāda:



pid_t dakša(spēkā neesošs);

Sistēmas dakša () funkcija nepieņem nevienu argumentu. Tas atgriež šāda veida veselu skaitli pid_t .





Veiksmīgi, fork () atgriež pakārtotā procesa PID, kas ir lielāks par 0. Iekšējā procesā atgriežamā vērtība ir 0. Ja dakša () neizdodas, tad atgriež -1.

Vienkārša dakša () Piemērs:

Tālāk ir sniegts vienkāršs dakšas () piemērs:



#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut

intgalvenais(spēkā neesošs) {
pid_t pid=dakša();

ja(pid== 0) {
printf ('Bērns => PPID: %d PID: %d n',getppid(),stulbs());
Izeja (EXIT_SUCCESS);
}
citādi ja(pid> 0) {
printf ('Vecāks => PID: %d n',stulbs());
printf ('Gaida bērna procesa pabeigšanu. n');
pagaidiet(NULL);
printf ('Bērna process ir pabeigts. n');
}
citādi {
printf ('Nevar izveidot bērna procesu. n');
}

atgrieztiesEXIT_SUCCESS;
}

Šeit es izmantoju fork (), lai izveidotu bērna procesu no galvenā/vecāku procesa. Pēc tam es izdrukāju PID (procesa ID) un PPID (vecāku procesa ID) no bērna un vecāku procesa. Vecāku procesā gaidīšana (NULL) tiek izmantota, lai gaidītu bērna procesa pabeigšanu. Bērna procesā, lai pabeigtu bērna procesu, tiek izmantota izeja (). Kā redzat, vecāku procesa PID ir bērna procesa PPID. Tātad, bērna process 24738 pieder vecāku procesam 24731 .

Varat arī izmantot funkcijas, lai padarītu savu programmu modulārāku. Lūk, es izmantoju processTask () un parentTask () funkcijas attiecīgi bērna un vecāku procesiem. Dakšu () faktiski izmanto šādi.

#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut

spēkā neesošsbērnsUzdevums() {
printf ('Sveika pasaule n');
}

spēkā neesošsparentTask() {
printf ('Galvenais uzdevums. n');
}

intgalvenais(spēkā neesošs) {
pid_t pid=dakša();

ja(pid== 0) {
bērnsUzdevums();
Izeja (EXIT_SUCCESS);
}
citādi ja(pid> 0) {
pagaidiet(NULL);
parentTask();
}
citādi {
printf ('Nevar izveidot bērna procesu.');
}

atgrieztiesEXIT_SUCCESS;
}

Iepriekš minētās programmas rezultāts:

Vairāku bērnu procesu palaišana, izmantojot dakšiņu () un cilpu:

Varat arī izmantot cilpu, lai izveidotu tik daudz bērnu procesu, cik nepieciešams. Zemāk redzamajā piemērā esmu izveidojis 5 pakārtotus procesus, izmantojot cilpu. Es arī izdrukāju PID un PPID no bērnu procesiem.

#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut

intgalvenais(spēkā neesošs) {
priekš(inti= 1;i<= 5;i++) {
pid_t pid=dakša();

ja(pid== 0) {
printf ('Bērnu process => PPID =%d, PID =%d n',getppid(),stulbs());
Izeja (0);
}
citādi {
printf ('Vecāku process => PID =%d n',stulbs());
printf ('Gaida, kad bērnu procesi tiks pabeigti ... n');
pagaidiet(NULL);
printf ('bērna process ir pabeigts. n');
}
}

atgrieztiesEXIT_SUCCESS;
}

Kā redzat, vecāku procesa ID visos bērnu procesos ir vienāds. Tātad, viņi visi pieder vienam un tam pašam vecākam. Viņi izpilda arī lineāri. Viens pēc otra. Bērnu procesu kontrole ir sarežģīts uzdevums. Ja jūs uzzināsit vairāk par Linux sistēmu programmēšanu un to, kā tā darbojas, jūs varēsit kontrolēt šo procesu plūsmu jebkurā gadījumā.

Reālās dzīves piemērs:

Dažādiem sarežģītiem matemātiskiem aprēķiniem, piemēram, md5, sha256 utt., Jaucēja ģenerēšana prasa lielu apstrādes jaudu. Tā vietā, lai aprēķinātu šādas lietas tajā pašā procesā kā galvenā programma, jūs varat vienkārši aprēķināt bērna procesa jaucējus un atgriezt hash galvenajā procesā.

Šajā piemērā es esmu ģenerējis četrciparu PIN kodu bērna procesā un nosūtījis to vecāku procesam, galvenajai programmai. Pēc tam es no turienes izdrukāju PIN kodu.

#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut

intgetPIN() {
// kā sēklu izmantojiet PPID un PID
srand (stulbs() +getppid());
intnoslēpums= 1000 + rinda () % 9000;
atgrieztiesnoslēpums;
}

intgalvenais(spēkā neesošs) {
intfd[2];
caurule(fd);
pid_t pid=dakša();

ja(pid> 0) {
aizvērt(0);
aizvērt(fd[1]);
pēc(fd[0]);

intsecretNumber;
size_treadBytes=lasīt(fd[0], &secretNumber, izmērs(secretNumber));

printf ('Gaida PIN ... n');
pagaidiet(NULL);
printf ('Baiti lasīti: %ld n',readBytes);
printf ('PIN: %d n',secretNumber);
}
citādi ja(pid== 0) {
aizvērt(1);
aizvērt(fd[0]);
pēc(fd[1]);

intnoslēpums=getPIN();
rakstīt(fd[1], &noslēpums, izmērs(noslēpums));
Izeja (EXIT_SUCCESS);
}

atgrieztiesEXIT_SUCCESS;
}

Kā redzat, katru reizi, palaižot programmu, es saņemu atšķirīgu 4 ciparu PIN kodu.

Tātad, pamatā jūs izmantojat sistēmas dakšas () sistēmas zvanu Linux. Paldies, ka izlasījāt šo rakstu.