Tawag sa System ng Linux Exec

Linux Exec System Call



Ang tawag sa exec system ay ginagamit upang magpatupad ng isang file na naninirahan sa isang aktibong proseso. Kapag tinawag ang exec ang dating maipapatupad na file ay papalitan at bagong file ang naisasagawa.

Mas tiyak, masasabi nating ang paggamit ng tawag sa exec system ay papalitan ang lumang file o programa mula sa proseso ng isang bagong file o programa. Ang buong nilalaman ng proseso ay pinalitan ng isang bagong programa.







Ang segment ng data ng gumagamit na nagpapatupad ng exec () na tawag sa system ay pinalitan ng file ng data na ang pangalan ay ibinigay sa argumento habang tumatawag sa exec ().



Ang bagong programa ay na-load sa parehong puwang ng proseso. Ang kasalukuyang proseso ay ginawang isang bagong proseso at samakatuwid ang proseso id PID ay hindi binago, ito ay dahil hindi kami lumilikha ng isang bagong proseso na pinapalitan lamang namin ang isang proseso ng isa pang proseso sa exec.



Kung ang kasalukuyang tumatakbo na proseso ay naglalaman ng higit sa isang thread pagkatapos ang lahat ng mga thread ay matatapos at ang bagong imahe ng proseso ay mai-load at pagkatapos ay naisakatuparan. Walang mga function ng destructor na winakasan ang mga thread ng kasalukuyang proseso.





Ang PID ng proseso ay hindi binago ngunit ang data, code, stack, heap, atbp. Ng proseso ay binago at pinalitan ng mga bagong load na proseso. Ang bagong proseso ay naisakatuparan mula sa entry point.

Ang tawag sa system ng Exec ay isang koleksyon ng mga pagpapaandar at sa wika ng C programa, ang karaniwang mga pangalan para sa mga pagpapaandar na ito ay ang mga sumusunod:



  1. execl
  2. execle
  3. execlp
  4. execv
  5. execve
  6. execvp


Dapat pansinin dito na ang mga pagpapaandar na ito ay may parehong base exec sinundan ng isa o higit pang mga titik. Ito ang ipinaliwanag sa ibaba:

At: Ito ay isang hanay ng mga payo na tumuturo sa mga variable ng kapaligiran at malinaw na naipasa sa bagong kargadong proseso.

ang: l ay para sa mga argumento ng linya ng utos na ipinasa ang isang listahan sa pagpapaandar

p: Ang p ay ang variable ng environment environment na makakatulong upang mahanap ang file na naipasa bilang isang argument na mai-load sa proseso.

v: Ang v ay para sa mga argumento ng linya ng utos. Ang mga ito ay naipasa bilang isang hanay ng mga payo sa pagpapaandar.

Bakit ginagamit ang exec?

Ginagamit ang exec kapag nais ng gumagamit na maglunsad ng isang bagong file o programa sa parehong proseso.

Inner Working ng exec

Isaalang-alang ang mga sumusunod na puntos upang maunawaan ang pagtatrabaho ng exec:

  1. Ang kasalukuyang imahe ng proseso ay napapatungan ng isang bagong imahe ng proseso.
  2. Ang bagong imahe ng proseso ay ang naipasa mo bilang exec argument
  3. Ang kasalukuyang proseso ng pagpapatakbo ay natapos na
  4. Ang bagong imahe ng proseso ay may parehong proseso ng ID, parehong kapaligiran, at parehong tagapaglarawan ng file (dahil hindi pinalitan ang proseso ay pinalitan ang imahe ng proseso)
  5. Ang CPU stat at virtual memory ay apektado. Ang pagmamapa ng virtual na memorya ng kasalukuyang imahe ng proseso ay pinalitan ng virtual memory ng bagong imahe ng proseso.

Mga syntax ng pagpapaandar ng pamilya exec:

Ang mga sumusunod ay ang mga syntax para sa bawat pagpapaandar ng exec:

int execl (const char * path, const char * arg, ...)
int execlp (const char * file, const char * arg,…)
int execle (const char * path, const char * arg,…, char * const envp [])
int execv (const char * path, const char * argv [])
int execvp (const char * file, const char * argv [])
int execvpe (const char * file, const char * argv [], char * const envp [])

Paglalarawan:

Ang uri ng pagbabalik ng mga pagpapaandar na ito ay Int. Kapag matagumpay na napalitan ang imahe ng proseso walang babalik sa pag-andar sa pagtawag dahil ang proseso na tumawag dito ay hindi na tumatakbo. Ngunit kung mayroong anumang error -1 ay ibabalik. Kung may anumang naganap na error an errno ay nakatakda.

Sa syntax:

  1. landas ay ginagamit upang tukuyin ang buong pangalan ng landas ng file na dapat isagawa.
  1. galit naipasa ba ang pagtatalo. Ito talaga ang pangalan ng file na isasagawa sa proseso. Karamihan sa mga oras ang halaga ng arg at path ay pareho.
  1. const char * arg sa mga function na execl (), execlp () at execle () ay isinasaalang-alang bilang arg0, arg1, arg2,…, argn. Karaniwan ito ay isang listahan ng mga payo upang i-null ang natapos na mga string. Dito itinuturo ng unang argumento ang filename na papatayin tulad ng inilarawan sa point 2.
  1. envp ay isang array na naglalaman ng mga pahiwatig na tumuturo sa mga variable ng kapaligiran.
  1. file ay ginagamit upang tukuyin ang pangalan ng path na makikilala ang landas ng bagong file ng imahe ng proseso.
  1. Ang mga pagpapaandar ng tawag ng exec na nagtatapos sa At ay ginagamit upang baguhin ang kapaligiran para sa bagong imahe ng proseso. Ang mga pagpapaandar na ito ay pumasa sa listahan ng setting ng kapaligiran sa pamamagitan ng paggamit ng argument envp . Ang argument na ito ay isang hanay ng mga character na tumuturo sa null na natapos na String at tumutukoy sa variable ng kapaligiran.

Upang magamit ang mga pagpapaandar ng pamilya ng exec, kailangan mong isama ang sumusunod na header file sa iyong C program:

# isama

Halimbawa 1: Paggamit ng exec system call sa C program

Isaalang-alang ang sumusunod na halimbawa kung saan ginamit namin ang tawag ng exec system sa C program sa Linux, Ubuntu: Mayroon kaming dalawang c file dito halimbawa.c at hello.c:

halimbawa.c

CODE:

# isama
# isama
# isama
intpangunahing(intargc, char *argv[])
{
printf ('PID ng halimbawa.c =% d n',getpid());
char *mga pagtatalo[] = {'Kamusta', 'C', 'Programming',WALA};
execv('./Kamusta',mga pagtatalo);
printf ('Bumalik sa halimbawa.c');
bumalik ka 0;
}

hello.c

CODE:

# isama
# isama
# isama
intpangunahing(intargc, char *argv[])
{
printf ('Nasa Hello kami.c n');
printf ('PID ng hello.c =% d n',getpid());
bumalik ka 0;
}

OUTPUT:

PID ng halimbawa.c = 4733
Nasa Hello kami.c
PID ng hello.c = 4733

Sa halimbawa sa itaas mayroon kaming isang halimbawa.c file at hello.c file. Sa halimbawang .c file una sa lahat nai-print namin ang ID ng kasalukuyang proseso (file example.c ay tumatakbo sa kasalukuyang proseso). Pagkatapos sa susunod na linya lumikha kami ng isang hanay ng mga character point. Ang huling elemento ng array na ito ay dapat na Null bilang ang terminating point.

Pagkatapos ay ginamit namin ang function execv () na kumukuha ng pangalan ng file at ang character pointer array bilang argument nito. Dapat pansinin dito na ginamit namin ./ na may pangalan ng file, tinutukoy nito ang landas ng file. Tulad ng file na nasa folder kung saan nakatira ang example.c kaya hindi na kailangang tukuyin ang buong landas.

Kapag tinawag ang pagpapaandar ng execv (), papalitan ang aming imahe ng proseso ngayon ang halimbawa ng file.c ay wala sa proseso ngunit ang file na hello.c ay nasa proseso. Maaaring makita na ang proseso ng ID ay pareho kung ang hello.c ay proseso ng imahe o halimbawa.c ay proseso ng imahe dahil pareho ang proseso at ang imahe ng proseso ay pinalitan lamang.

Pagkatapos mayroon kaming isa pang bagay na dapat tandaan dito na kung saan ay ang printf () na pahayag pagkatapos ng execv () ay hindi naisakatuparan. Ito ay sapagkat ang kontrol ay hindi naibalik sa dating proseso ng imahe sa sandaling pinalitan ito ng bagong imahe ng proseso. Babalik lamang ang kontrol sa pag-andar sa pagtawag kapag ang pagpapalit ng imahe ng proseso ay hindi matagumpay. (Ang halagang bumalik ay -1 sa kasong ito).

Pagkakaiba sa pagitan ng fork () at exec () na mga tawag sa system:

Ang tawag sa system ng fork () ay ginagamit upang lumikha ng isang eksaktong kopya ng isang tumatakbo na proseso at ang nilikha na kopya ay ang proseso ng bata at ang proseso ng pagpapatakbo ay ang proseso ng magulang. Samakatuwid, ang tawag ng system ng exec () na system ay ginagamit upang palitan ang isang imahe ng proseso ng isang bagong imahe ng proseso. Samakatuwid walang konsepto ng mga proseso ng magulang at anak sa pagtawag sa system (exec).

Sa tinidor () tinawag ng system ang proseso ng magulang at anak ay naisakatuparan nang sabay. Ngunit sa exec () tawag sa system, kung ang pagpapalit ng imahe ng proseso ay matagumpay, ang control ay hindi babalik sa kung saan tinawag ang exec function sa halip ay isasagawa nito ang bagong proseso. Malilipat lamang ang kontrol kung mayroong anumang error.

Halimbawa 2: Pagsasama ng tinidor () at exec () na mga tawag sa system

Isaalang-alang ang sumusunod na halimbawa kung saan ginamit namin ang parehong tinidor () at exec () na mga tawag sa system sa parehong programa:

halimbawa.c

CODE:

# isama
# isama
# isama
intpangunahing(intargc, char *argv[])
{
printf ('PID ng halimbawa.c =% d n',getpid());
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 n');
printf ('Calling hello.c mula sa proseso ng bata n');
char *mga pagtatalo[] = {'Kamusta', 'C', 'Programming',WALA};
execv('./Kamusta',mga pagtatalo);
}
iba pa
{
printf ('Nasa proseso kami ng magulang');
}
bumalik ka 0;
}

hello.c:

CODE:

# isama
# isama
# isama
intpangunahing(intargc, char *argv[])
{
printf ('Nasa Hello kami.c n');
printf ('PID ng hello.c =% d n',getpid());
bumalik ka 0;
}

OUTPUT:

PID ng halimbawa.c = 4790
Nasa Proseso ng Magulang kami
Nasa Proseso ng Bata kami
Pagtawag sa hello.c mula sa proseso ng bata
Kami ay nasa hello.c
PID ng hello.c = 4791

Sa halimbawang ito, gumamit kami ng tinidor () tawag sa system. Kapag nilikha ang proseso ng bata 0 ay itatalaga sa p at pagkatapos ay lilipat tayo sa proseso ng bata. Ngayon ang bloke ng mga pahayag na may kung (p == 0) ay naisakatuparan. Ang isang mensahe ay ipinapakita at gumamit kami ng execv () tawag sa system at ang kasalukuyang imahe ng proseso ng bata na halimbawa.c ay papalitan ng hello.c. Bago ang execv () tumawag sa proseso ng anak at magulang ay pareho.

Makikita na ang PID ng halimbawa.c at hello.c ay iba na ngayon. Ito ay dahil ang example.c ay ang imahe ng proseso ng magulang at hello.c ang imahe ng proseso ng bata.