Tawag sa System ng Fork ng Linux

Fork System Call Linux



Ang tawag sa fork system ay ginagamit upang lumikha ng isang bagong proseso. Ang bagong nilikha na proseso ay ang proseso ng bata. Ang proseso na tumatawag ng tinidor at lumilikha ng isang bagong proseso ay ang proseso ng magulang. Ang proseso ng bata at magulang ay naisasagawa nang sabay-sabay.

Ngunit ang proseso ng bata at magulang ay naninirahan sa iba't ibang mga puwang ng memorya. Ang mga puwang sa memorya na ito ay may parehong nilalaman at anuman ang pagpapatakbo na isinagawa ng isang proseso ay hindi makakaapekto sa iba pang proseso.







Kapag ang proseso ng bata ay nilikha; Ngayon ang parehong mga proseso ay magkakaroon ng parehong Program Counter (PC), kaya't kapwa ang mga proseso na ito ay magtuturo sa parehong susunod na tagubilin. Ang mga file na binuksan ng proseso ng magulang ay magiging pareho para sa proseso ng bata.



Ang proseso ng bata ay eksaktong kapareho ng magulang nito ngunit may pagkakaiba sa mga proseso ng ID:



  1. Ang proseso ng ID ng proseso ng bata ay isang natatanging proseso ng ID na naiiba mula sa ID ng lahat ng iba pang mga mayroon nang proseso.
  2. Ang proseso ng proseso ng Magulang ay magiging kapareho ng proseso ng ID ng magulang ng bata.

Mga Katangian ng Proseso ng Bata

Ang mga sumusunod ay ilan sa mga pag-aari na hawak ng isang proseso ng bata:





  1. Ang mga counter ng CPU at ang mga paggamit ng mapagkukunan ay naisasimulan upang mai-reset sa zero.
  2. Kapag natapos ang proseso ng magulang, ang mga proseso ng bata ay hindi nakakatanggap ng anumang senyas dahil ang PR_SET_PDEATHSIG na katangian sa prctl () ay na-reset.
  3. Ang thread na ginamit upang tawagan ang tinidor () ay lumilikha ng proseso ng bata. Kaya't ang address ng proseso ng bata ay magiging kapareho ng magulang.
  4. Ang deskriptor ng file ng proseso ng magulang ay minana ng proseso ng bata. Halimbawa ang offset ng file o katayuan ng mga watawat at ang mga katangian ng I / O ay ibabahagi sa mga tagapaglaraw ng file ng proseso ng bata at magulang. Kaya't ang deskriptor ng file ng magulang na klase ay magre-refer sa parehong tagapaglarawan ng file ng klase ng bata.
  5. Ang mga naglalarawan ng bukas na mensahe ng pila ng proseso ng magulang ay minana ng proseso ng bata. Halimbawa kung ang isang deskriptor ng file ay naglalaman ng isang mensahe sa proseso ng magulang ang parehong mensahe ay naroroon sa kaukulang tagapaglarawan ng file ng proseso ng bata. Kaya maaari nating sabihin na ang mga halaga ng watawat ng mga deskripor ng file na ito ay pareho.
  6. Gayundin ang bukas na mga stream ng direktoryo ay magmamana ng mga proseso ng bata.
  7. Ang default na Timer slack na halaga ng klase ng bata ay kapareho ng kasalukuyang halaga ng slack ng timer ng klase ng magulang.

Mga pag-aari na hindi minana ng proseso ng Bata

Ang mga sumusunod ay ilan sa mga pag-aari na hindi minana ng isang proseso ng bata:

  1. Mga kandado sa memorya
  2. Ang nakabinbing signal ng isang klase ng bata ay walang laman.
  3. Iproseso ang mga nauugnay na kandado ng rekord (fcntl ())
  4. Hindi magkakasunod na mga pagpapatakbo ng I / O at mga nilalaman ng I / O.
  5. Mga notification sa pagbabago ng direktoryo.
  6. Ang mga timer tulad ng alarm (), setitimer () ay hindi minana ng klase ng bata.

tinidor () sa C

Walang mga argumento sa tinidor () at ang uri ng pagbabalik ng tinidor () ay integer. Kailangan mong isama ang mga sumusunod na mga file ng header kapag ginamit ang fork ():



# isama
# isama
# isama

Kapag nagtatrabaho sa tinidor (), maaaring magamit para sa uri pid_t para sa mga proseso ng ID bilang pid_t ay tinukoy sa.

Ang header file ay kung saan tinukoy ang tinidor () kaya kailangan mong isama ito sa iyong programa upang magamit ang tinidor ().

Ang uri ng pagbabalik ay tinukoy sa at tinidor () tawag ay tinukoy sa. Samakatuwid, kailangan mong isama ang pareho sa iyong programa upang magamit ang fork () na tawag sa system.

Syntax ng tinidor ()

Ang syntax ng fork () na tawag sa system sa Linux, Ubuntu ay ang mga sumusunod:

pid_t fork (walang bisa);

Sa syntax ang uri ng pagbabalik ay pid_t . Kapag ang proseso ng bata ay matagumpay na nilikha, ang PID ng proseso ng bata ay naibalik sa proseso ng magulang at 0 ay ibabalik sa proseso mismo ng bata.

Kung mayroong anumang error pagkatapos -1 ay ibabalik sa proseso ng magulang at ang proseso ng bata ay hindi nilikha.

No arguments are passed to fork(). 

Halimbawa 1: Calling fork ()

Isaalang-alang ang sumusunod na halimbawa kung saan ginamit namin ang tawag sa system ng fork () upang lumikha ng isang bagong proseso ng bata:

CODE:

# isama
# isama
# isama

intpangunahing()
{
tinidor();
printf ('Paggamit ng tinidor () tawag sa system n');
bumalik ka 0;
}

OUTPUT:

Gamit ang tawag sa system ng fork ()
Gamit ang tawag sa system ng fork ()

Sa program na ito, gumamit kami ng tinidor (), lilikha ito ng isang bagong proseso ng bata. Kapag nilikha ang proseso ng bata, kapwa ang proseso ng magulang at ang proseso ng bata ay magtuturo sa susunod na tagubilin (parehong Program Counter). Sa ganitong paraan ang natitirang mga tagubilin o pahayag ng C ay naisasagawa sa kabuuang bilang ng mga oras ng proseso, iyon ay 2nbeses, kung saan n ang bilang ng mga tinawag na system ng tinidor ().

Kaya't kapag ang tinawag na tinidor () ay ginagamit nang isang beses sa itaas (21= 2) magkakaroon kami ng aming output ng 2 beses.

Dito kapag ginamit ang tawag sa system ng fork (), magiging hitsura ang panloob na istraktura:

Isaalang-alang ang sumusunod na kaso kung saan ang tinidor () ay ginagamit ng 4 na beses:

CODE:

# isama
# isama
# isama

intpangunahing()
{
tinidor();
tinidor();
tinidor();
tinidor();
printf ('Paggamit ng tinidor () tawag sa system');
bumalik ka 0;
}

Output:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Ngayon ang kabuuang bilang ng proseso na nilikha ay 24= 16 at mayroon kaming naka-print na pahayag ng 16 beses.

Halimbawa 2: Pagsubok kung ang tinidor () ay matagumpay

Sa sumusunod na halimbawa ginamit namin ang paggawa ng desisyon upang subukan ang halaga (int) na ibinalik ng tinidor (). At ang mga kaukulang mensahe ay ipinapakita:

CODE:

# isama
# isama
# isama

intpangunahing()
{
pid_t p;
p=tinidor();
kung(p== -1)
{
printf ('Mayroong isang error habang tumatawag ng fork ()');
}
kung(p==0)
{
printf ('Nasa proseso kami ng bata');
}
iba pa
{
printf ('Nasa proseso kami ng magulang');
}
bumalik ka 0;
}

OUTPUT:

Nasa proseso kami ng magulang
Nasa proseso kami ng bata

Sa halimbawa sa itaas ginamit namin ang uri ng pid_t na mag-iimbak ng halaga ng pagbalik ng tinidor (). tinidor () ay tinawag sa linya:

p=tinidor();

Kaya't ang integer na halaga na ibinalik ng tinidor () ay nakaimbak sa p at pagkatapos ang p ay inihambing upang suriin kung ang aming tinawag na tinidor () ay matagumpay.

Kapag ginamit ang tawag na fork () at matagumpay na nilikha ang bata, ibabalik sa proseso ng magulang ang id ng proseso ng bata at ibabalik sa proseso ng bata. Ang ID ng proseso ng bata sa proseso ng Magulang ay hindi magiging kapareho ng ID ng proseso ng bata sa proseso ng bata mismo. Sa proseso ng bata ang ID ng proseso ng bata ay magiging 0.

Sa tutorial na ito maaari mong makita kung paano magsimula sa tawag sa fork system sa linux.