C Programmēšana

Dakšu sistēmas izsaukums C

Dakšu sistēmas izsaukums C
fork () sistēmas izsaukums tiek izmantots, lai izveidotu bērnu procesus C programmā. fork () tiek izmantots, ja jūsu lietojumprogrammā ir nepieciešama paralēla apstrāde. Dakšas () sistēmas funkcija ir definēta galvenēs sys / veidi.h un unistd.h. Programmā, kurā izmantojat dakšiņu, jāizmanto arī wait () sistēmas izsaukums. wait () sistēmas izsaukums tiek izmantots, lai vecāku procesā gaidītu, kamēr bērns process tiks pabeigts. Lai pabeigtu bērna procesu, bērna procesā tiek izmantots izejas () izsaukums. Funkcija wait () ir definēta galvenē sys / pagaidiet.h un izejas () funkcija ir definēta galvenē stdlib.h.

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

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

dakša () sintakse un atgriešanās vērtība:

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

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

Sistēmas funkcija fork () nepieņem nevienu argumentu. Tas atgriež visa veida skaitli pid_t.

Pēc panākumiem fork () atgriež bērna procesa PID, kas ir lielāks par 0. Bērna procesā atgriešanās vērtība ir 0. Ja dakša () neizdodas, tā atgriež -1.

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

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

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
int main (void)
pid_t pid = dakša ();
 
ja (pid == 0)
printf ("Bērns => PPID:% d PID:% d \ n", getppid (), getpid ());
izeja (EXIT_SUCCESS);

cits, ja (pid> 0)
printf ("Vecāks => PID:% d \ n", getpid ());
printf ("Gaida bērna procesa pabeigšanu.\ n ");
pagaidiet (NULL);
printf ("Bērna process pabeigts.\ n ");

cits
printf ("Nevar izveidot bērnu procesu.\ n ");

 
atgriešanās EXIT_SUCCESS;

Šeit es izmantoju fork (), lai izveidotu bērnu procesu no galvenā / vecāka 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, kad bērna process būs pabeigts. Bērna procesā izeju () izmanto, lai pabeigtu bērna procesu. 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 programmu padarītu modulārāku. Lūk, es izmantoju processTask () un parentTask () funkcijas attiecīgi bērna un vecāku procesiem. Šādi faktiski tiek izmantota dakša ().

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
void childTask ()
printf ("Sveika pasaule \ n");

 
void parentTask ()
printf ("Galvenais uzdevums.\ n ");

 
int main (void)
pid_t pid = dakša ();
 
ja (pid == 0)
childTask ();
izeja (EXIT_SUCCESS);

cits, ja (pid> 0)
pagaidiet (NULL);
parentTask ();

cits
printf ("Nevar izveidot bērnu procesu.");

 
atgriešanās EXIT_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. Tālāk sniegtajā piemērā esmu izveidojis 5 bērnu procesus, izmantojot cilpu. Es arī izdrukāju PID un PPID no bērnu procesiem.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
int main (void)
par (int i = 1; i <= 5; i++)
pid_t pid = dakša ();
 
ja (pid == 0)
printf ("Bērna process => PPID =% d, PID =% d \ n", getppid (), getpid ());
izeja (0);

cits
printf ("Vecāku process => PID =% d \ n", getpid ());
printf ("Gaida bērnu procesu pabeigšanu ... \ n");
pagaidiet (NULL);
printf ("bērna process pabeigts.\ n ");


 
atgriešanās EXIT_SUCCESS;

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

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

Dažādiem sarežģītiem matemātiskiem aprēķiniem, piemēram, md5, sha256 utt., Hash ģenerēšanai ir nepieciešama liela apstrādes jauda. Tā vietā, lai aprēķinātu tādas lietas vienā un tajā pašā procesā kā galvenā programma, jūs varat vienkārši aprēķināt bērna procesa jaucēju un atgriezt jaudu galvenajā procesā.

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

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
int getPIN ()
// izmantot sēklas PPID un PID
srand (getpid () + getppid ());
int noslēpums = 1000 + rand ()% 9000;
atgriešanās noslēpums;

 
int main (void)
int fd [2];
caurule (fd);
pid_t pid = dakša ();
 
ja (pid> 0)
aizvērt (0);
aizvērt (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = lasīt (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Gaida PIN ... \ n");
pagaidiet (NULL);
printf ("nolasītie baiti:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

cits, ja (pid == 0)
aizvērt (1);
aizvērt (fd [0]);
dup (fd [1]);
 
int noslēpums = getPIN ();
rakstīt (fd [1], & secret, sizeof (secret));
izeja (EXIT_SUCCESS);

 
atgriešanās EXIT_SUCCESS;

Kā redzat, katru reizi, kad palaižu programmu, es saņemu citu četrciparu PIN kodu.

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

Kā lejupielādēt un atskaņot Sid Meier Civilization VI operētājsistēmā Linux
Ievads spēlē Civilization 6 ir mūsdienīga klasiskā koncepcija, kas ieviesta Age of Empires spēļu sērijā. Ideja bija diezgan vienkārša; jūs sāktu pašā ...
Kā instalēt un spēlēt Doom uz Linux
Ievads liktenī Doom sērija radās 90. gados pēc sākotnējā Doom izlaišanas. Tas bija tūlītējs hīts, un kopš tā laika spēļu sērija ir saņēmusi daudzas ba...
Vulkan Linux lietotājiem
Ar katru jauno grafisko karšu paaudzi mēs redzam, kā spēļu izstrādātāji pārspēj grafiskās uzticamības robežas un tuvojas fotoreālismam. Neskatoties uz...