Tumawag ang Exec System sa C

Exec System Call C



Ang pamilya exec ay maraming mga pag-andar sa C. Ang mga pagpapaandar sa C ay karaniwang ginagamit upang magpatakbo ng isang utos ng system sa isang hiwalay na proseso na ang pangunahing programa at i-print ang output.

Sa artikulong ito, pag-uusapan ko ang tungkol sa pamilya ng exec ng mga pagpapaandar at ipapakita sa iyo kung paano gamitin ang bawat isa sa mga pagpapaandar ng pamilya ng exec na ito sa C. Kaya, magsimula tayo.







Mga Pag-andar ng C System sa Exec Family:

Ang mga pamilya ng pagpapaandar ng exec ay tinukoy sa header unistd.h . Kaya, dapat mong gamitin ang header na ito sa programa ng C kung saan mo nais gamitin ang mga pagpapaandar na ito.



Ang mga magagamit na pagpapaandar ng exec kasama ang kanilang mga parameter ng pagpapaandar ay ibinibigay sa ibaba:



  • int execl (const char * path, const char * arg,…, NULL);
  • int execlp (const char * file, const char * arg,…, NULL);
  • int execv (const char * path, char * const argv []);
  • int execvp (const char * file, char * const argv []);
  • int execle (const char * path, const char * arg,…, NULL, char * const envp []);
  • int execve (const char * file, char * const argv [], char * const envp []);

Tingnan natin kung ano ang ginagawa ng bawat isa sa mga pagpapaandar na ito at kung paano ito gamitin.





execl () Pag-andar ng System:

Sa execl () ang pag-andar ng system ay tumatagal ng landas ng maipapatupad na binary file (i. / basahan / ls ) bilang una at pangalawang argumento. Pagkatapos, ang mga argumento (ibig sabihin -lh , / bahay ) Na nais mong ipasa sa maipapatupad na sinusundan ng WALA . Pagkatapos ang execl () na pagpapaandar ng system ay nagpapatakbo ng utos at i-print ang output. Kung may anumang error na naganap, pagkatapos ang execl () ay magbabalik -1. Kung hindi man, wala itong ibabalik.

Syntax:

intexecl(Const char *landas, Const char *galit,...,WALA);

Ang isang halimbawa ng execl () na pagpapaandar ng system ay ibinibigay sa ibaba:



# isama

intpangunahing(walang bisa) {
char *binaryPath= '/ bin / ls';
char *arg1= '-lh';
char *arg2= '/ bahay';

execl(binaryPath,binaryPath,arg1,arg2,WALA);

bumalik ka 0;
}

Pinatakbo ko ang ls -lh / home utos gamit ang execl () pagpapaandar ng system. Tulad ng nakikita mo, ang tamang resulta ay ipinapakita.

execlp () Pag-andar ng System:

execl () ay hindi gumagamit ng PATH variable ng kapaligiran. Kaya, ang buong landas ng maipapatupad na file ay kinakailangan upang patakbuhin ito gamit ang execl (). execlp () ay gumagamit ng variable na kapaligiran ng PATH. Kaya, kung ang isang maipapatupad na file o utos ay magagamit sa PATH, kung gayon ang utos o ang filename ay sapat na upang patakbuhin ito, hindi kinakailangan ang buong landas.

Syntax:

intexeclp(Const char *file, Const char *galit,...,WALA);

Maaari naming muling isulat ang halimbawa ng execl () gamit ang execlp () na pagpapaandar ng system tulad ng sumusunod:

# isama

intpangunahing(walang bisa) {
char *programaName= 'ls';
char *arg1= '-lh';
char *arg2= '/ bahay';

execlp(programaName,programaName,arg1,arg2,WALA);

bumalik ka 0;
}

Pinasa ko lang ang pangalan ng utos ls , hindi ang buong landas / basahan / ls . Tulad ng nakikita mo, nakuha ko ang parehong output tulad ng dati.

execv () Pag-andar ng System:

Sa pagpapaandar ng execl (), ang mga parameter ng maipapatupad na file ay ipinapasa sa pagpapaandar bilang iba't ibang mga argumento. Sa execv (), maaari mong ipasa ang lahat ng mga parameter sa isang null na tinapos na array argv . Ang unang elemento ng array ay dapat na ang landas ng maipapatupad na file. Kung hindi man, gumagana ang execv () function tulad ng execl () function.

Syntax:

intexecv(Const char *landas, char *Constargv[]);

Maaari naming muling isulat ang halimbawa ng execl () tulad ng sumusunod:

# isama

intpangunahing(walang bisa) {
char *binaryPath= '/ bin / ls';
char *mga argumento[] = {binaryPath, '-lh', '/ bahay',WALA};

execv(binaryPath,mga argumento);

bumalik ka 0;
}

Tulad ng nakikita mo, nakakakuha ako ng tamang output.

execvp () Pag-andar ng System:

Gumagawa sa parehong paraan tulad ng execv () pagpapaandar ng system. Ngunit, ang variable ng PATH na kapaligiran ay ginagamit. Kaya, ang buong landas ng maipapatupad na file ay hindi kinakailangan tulad ng sa execlp ().

Syntax:

intexecvp(Const char *file, char *Constargv[]);

Maaari naming muling isulat ang halimbawa ng execv () tulad ng sumusunod:

# isama

intpangunahing(walang bisa) {
char *programaName= 'ls';
char *mga argumento[] = {programaName, '-lh', '/ bahay',WALA};

execvp(programaName,mga argumento);

bumalik ka 0;
}

Tulad ng nakikita mo, ang tamang output ay ipinapakita.

execle () Pag-andar ng System:

Gumagana tulad ng execl () ngunit maaari kang magbigay ng iyong sariling mga variable sa kapaligiran kasama nito. Ang mga variable ng kapaligiran ay ipinapasa bilang isang array envp . Ang huling elemento ng envp dapat na NUL ang array. Ang lahat ng iba pang mga elemento ay naglalaman ng mga pares ng key-halaga bilang string.

Syntax:

intexecle(Const char *landas, Const char *galit,...,WALA, char * Constenvp[] );

Ang isang halimbawa ng execle () na pagpapaandar ng system ay ibinibigay sa ibaba:

# isama

intpangunahing(walang bisa) {
char *binaryPath= '/ bin / bash';
char *arg1= '-c';
char *arg2= 'itinapon'Bisitahin ang $ HOSTNAME:$ PORT mula sa iyong browser.';
char *Constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',WALA};

execle(binaryPath,binaryPath,arg1,arg2,WALA,env);

bumalik ka 0;
}

Nagpasa ako ng dalawang variable ng kapaligiran HOSTNAME at PORT sa pagpapaandar ng execle (). Tulad ng nakikita mo, maaari kong ma-access ang mga ito mula sa maipapatupad / basahan / bash .

execve () Pag-andar ng System:

Tulad ng execle () maaari kang magbigay ng iyong sariling mga variable sa kapaligiran kasama ang execve (). Maaari mo ring ipasa ang mga argumento bilang mga array tulad ng ginawa mo sa execv ().

Syntax:

intexecve(Const char *file, char *Constargv[], char *Constenvp[]);

Ang halimbawa ng execle () ay maaaring muling isulat bilang mga sumusunod:

# isama

intpangunahing(walang bisa) {
char *binaryPath= '/ bin / bash';
char *Constmga argumento[] = {binaryPath, '-c', 'itinapon'Bisitahin ang $ HOSTNAME:$ PORT
mula sa iyong browser.',WALA};
char *Constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',WALA};

execve(binaryPath,mga argumento,env);

bumalik ka 0;
}

Tulad ng nakikita mo, nakakakuha kami ng parehong output tulad ng halimbawa ng execle ().

Kaya, iyan ang paraan mo ng paggamit ng exec function na pamilya sa C para sa system programming sa Linux. Salamat sa pagbabasa ng artikulong ito.