Tawag sa System ng Fork sa C

Fork System Call C



ginagamit ang tawag sa tinidor () ng system call upang lumikha ng mga proseso ng bata sa isang C program. ginagamit ang fork () kung saan kinakailangan ang parallel processing sa iyong aplikasyon. Ang pagpapaandar ng tinidor () na sistema ay tinukoy sa mga header sys / mga uri.h at unistd.h . Sa isang programa kung saan gumagamit ka ng tinidor, kailangan mo ring gumamit ng tawag () na tawag sa system. maghintay () ang tawag sa system ay ginagamit upang maghintay sa proseso ng magulang para matapos ang proseso ng bata. Upang tapusin ang isang proseso ng bata, ginagamit ang exit () na tawag sa system sa proseso ng bata. Ang pagpapaandar ng paghihintay () ay tinukoy sa header sys / wait.h at ang pag-andar ng exit () ay tinukoy sa header stdlib.h .

Fig 1: Pangunahing fork () daloy ng trabaho

Fig 1: Pangunahing fork () daloy ng trabaho







Sa artikulong ito, ipapakita ko sa iyo kung paano gamitin ang tawag sa system ng fork () upang lumikha ng mga proseso ng bata sa C. Kaya, magsimula tayo.



tinidor () Syntax at Halaga ng Pagbabalik:

Ang syntax ng fork () na pagpapaandar ng system ay ang mga sumusunod:



pid_t tinidor(walang bisa);

Ang tinidor () na pagpapaandar ng system ay hindi tumatanggap ng anumang pagtatalo. Nagbabalik ito ng isang integer ng uri pid_t .





Sa tagumpay, tinutumbok ng tinidor () ang PID ng proseso ng bata na mas malaki sa 0. Sa loob ng proseso ng bata, ang halaga ng pagbalik ay 0. Kung nabigo ang tinidor (), nagbabalik ito -1.

Simpleng tinidor () Halimbawa:

Ang isang simpleng halimbawa ng fork () ay ibinibigay sa ibaba:



# isama
# isama
# isama
# isama
# isama

intpangunahing(walang bisa) {
pid_t pid=tinidor();

kung(pid== 0) {
printf ('Bata => PPID:% d PID:% d n',getppid(),getpid());
labasan (EXIT_SUCCESS);
}
iba pa kung(pid> 0) {
printf ('Magulang => PID:% d n',getpid());
printf ('Naghihintay para matapos ang proseso ng bata. n');
teka(WALA);
printf ('Tapos na ang proseso ng bata. n');
}
iba pa {
printf ('Hindi makalikha ng proseso ng bata. n');
}

bumalik kaEXIT_SUCCESS;
}

Dito, gumamit ako ng tinidor () upang lumikha ng isang proseso ng bata mula sa pangunahing proseso ng magulang / magulang. Pagkatapos, nai-print ko ang PID (Process ID) at PPID (Parent Process ID) mula sa proseso ng bata at magulang. Sa proseso ng magulang maghintay (NULL) ay ginagamit upang maghintay para matapos ang proseso ng bata. Sa proseso ng bata, ang exit () ay ginagamit upang matapos ang proseso ng bata. Tulad ng nakikita mo, ang PID ng proseso ng magulang ay ang PPID ng proseso ng bata. Kaya, ang proseso ng bata 24738 kabilang sa proseso ng magulang 24731 .

Maaari mo ring gamitin ang mga pagpapaandar upang gawing mas modular ang iyong programa. Dito, ginamit ko processTask () at parentTask () pagpapaandar para sa proseso ng bata at magulang ayon sa pagkakabanggit. Ganito talaga ginagamit ang tinidor ().

# isama
# isama
# isama
# isama
# isama

walang bisabatangGawain() {
printf ('Hello World n');
}

walang bisamagulangTask() {
printf ('Pangunahing gawain. n');
}

intpangunahing(walang bisa) {
pid_t pid=tinidor();

kung(pid== 0) {
batangGawain();
labasan (EXIT_SUCCESS);
}
iba pa kung(pid> 0) {
teka(WALA);
magulangTask();
}
iba pa {
printf ('Hindi makalikha ng proseso ng bata.');
}

bumalik kaEXIT_SUCCESS;
}

Ang output ng nabanggit na programa:

Pagpapatakbo ng Maramihang Mga Proseso ng Bata gamit ang fork () at Loop:

Maaari mo ring gamitin ang loop upang lumikha ng maraming proseso ng bata hangga't kailangan mo. Sa halimbawa sa ibaba, lumikha ako ng 5 proseso ng bata na ginagamit para sa loop. Nag-print din ako ng PID at PPID mula sa proseso ng bata.

# isama
# isama
# isama
# isama
# isama

intpangunahing(walang bisa) {
para sa(intako= 1;ako<= 5;ako++) {
pid_t pid=tinidor();

kung(pid== 0) {
printf ('Proseso ng bata => PPID =% d, PID =% d n',getppid(),getpid());
labasan (0);
}
iba pa {
printf ('Proseso ng magulang => PID =% d n',getpid());
printf ('Naghihintay para matapos ang proseso ng bata ... n');
teka(WALA);
printf ('proseso ng bata natapos. n');
}
}

bumalik kaEXIT_SUCCESS;
}

Tulad ng nakikita mo, ang proseso ng proseso ng Magulang ay pareho sa lahat ng proseso ng bata. Kaya, lahat sila ay kabilang sa iisang magulang. Nagsasagawa din sila sa linear fashion. Isa pagkatapos ng isa. Ang pagkontrol sa mga proseso ng bata ay isang sopistikadong gawain. Kung malalaman mo ang higit pa tungkol sa pag-program ng system ng Linux at kung paano ito gumagana, makokontrol mo ang daloy ng mga proseso na ito kung nais mo pa rin.

Halimbawa ng Tunay na Buhay:

Ang iba't ibang mga kumplikadong pagkalkula ng matematika tulad ng md5, sha256 atbp hash na henerasyon ay nangangailangan ng maraming kapangyarihan sa pagproseso. Sa halip na i-compute ang mga bagay na tulad nito sa parehong proseso tulad ng pangunahing programa, maaari mo lamang kalkulahin ang hash sa isang proseso ng bata at ibalik ang hash sa pangunahing proseso.

Sa sumusunod na halimbawa, nakabuo ako ng isang 4-digit na PIN code sa isang proseso ng bata at ipinadala ito sa proseso ng magulang, ang pangunahing programa. Pagkatapos, nai-print ko doon ang PIN code.

# isama
# isama
# isama
# isama
# isama

intgetPIN() {
// use PPID and PID as the seed
srand (getpid() +getppid());
intlihim= 1000 + hilera () % 9000;
bumalik kalihim;
}

intpangunahing(walang bisa) {
inttaut[2];
tubo(taut);
pid_t pid=tinidor();

kung(pid> 0) {
malapit na(0);
malapit na(taut[1]);
pagkatapos(taut[0]);

intsikretoBilang;
size_treadBytes=basahin(taut[0], &sikretoBilang, sukat ng(sikretoBilang));

printf ('Naghihintay para sa PIN ... n');
teka(WALA);
printf (Basahin ang mga byte:% ld n',readBytes);
printf ('PIN:% d n',sikretoBilang);
}
iba pa kung(pid== 0) {
malapit na(1);
malapit na(taut[0]);
pagkatapos(taut[1]);

intlihim=getPIN();
sumulat(taut[1], &lihim, sukat ng(lihim));
labasan (EXIT_SUCCESS);
}

bumalik kaEXIT_SUCCESS;
}

Tulad ng nakikita mo, sa tuwing patakbuhin ko ang programa, nakakakuha ako ng ibang 4-digit na PIN code.

Kaya, iyan talaga kung paano mo ginagamit ang tawag sa system ng fork () sa Linux. Salamat sa pagbabasa ng artikulong ito.