Izpildiet sistēmas zvanu C

Exec System Call C



Izpildes saimei ir daudz funkciju C. Šīs C funkcijas būtībā tiek izmantotas, lai palaistu sistēmas komandu atsevišķā procesā, ko veic galvenā programma, un izdrukā izvadi.

Šajā rakstā es runāšu par izpildītāju funkciju saimi un parādīšu, kā izmantot katru no šīm izpildes ģimenes funkcijām C. Tātad, sāksim darbu.







C Sistēmas funkcijas Exec ģimenē:

Izpildes funkciju saimes ir definētas galvenē unistd.h . Tātad, jums ir jāizmanto šī galvene programmā C, kur vēlaties izmantot šīs funkcijas.



Pieejamās izpildfunkcijas kopā ar to funkciju parametriem ir norādītas zemāk:



  • int execl (const char *ceļš, const char *arg,…, NULL);
  • int execlp (const char *fails, const char *arg,…, NULL);
  • int execv (const char *ceļš, char *const argv []);
  • int execvp (const char *fails, char *const argv []);
  • int execle (const char *ceļš, const char *arg,…, NULL, char *const envp []);
  • int execve (const char *fails, char *const argv [], char *const envp []);

Apskatīsim, ko katra no šīm funkcijām dara un kā tās izmantot.





execl () Sistēmas funkcija:

Programmā execl () sistēmas funkcija paņem izpildāmā binārā faila ceļu (t.i. / bin / ls ) kā pirmais un otrais arguments. Pēc tam argumenti (t.i. -lh , /mājas ), kuru vēlaties nodot izpildāmajam, kam seko NULL . Tad izpildes () sistēmas funkcija palaiž komandu un izdrukā izvadi. Ja rodas kāda kļūda, tad execl () atgriež -1. Pretējā gadījumā tas neko neatgriež.

Sintakse:

intizpildīt(konst char *ceļš, konst char *dusmīgs,...,NULL);

Sistēmas funkcijas execl () piemērs ir dots zemāk:



#iekļaut

intgalvenais(spēkā neesošs) {
char *binaryPath= ' / bin / ls';
char *arg1= '' lh '';
char *arg2= '/mājas';

izpildīt(binaryPath,binaryPath,arg1,arg2,NULL);

atgriezties 0;
}

Es skrēju ls -lh / mājās komanda, izmantojot execl () sistēmas funkciju. Kā redzat, tiek parādīts pareizais rezultāts.

execlp () Sistēmas funkcija:

execl () neizmanto PATH vides mainīgais. Tātad, lai palaistu to ar execl (), ir nepieciešams pilns izpildāmā faila ceļš. execlp () izmanto vides mainīgo PATH. Tātad, ja PATH ir pieejams izpildāms fails vai komanda, tad ar komandu vai faila nosaukumu pietiek, lai to palaistu, pilns ceļš nav nepieciešams.

Sintakse:

intizpildīt(konst char *failu, konst char *dusmīgs,...,NULL);

Mēs varam pārrakstīt execl () piemēru, izmantojot sistēmas funkciju execlp () šādi:

#iekļaut

intgalvenais(spēkā neesošs) {
char *programName= 'ls';
char *arg1= '' lh '';
char *arg2= '/mājas';

izpildīt(programName,programName,arg1,arg2,NULL);

atgriezties 0;
}

Es nokārtoju tikai komandas nosaukumu ls , ne pilnu ceļu / bin / ls . Kā redzat, es saņēmu tādu pašu rezultātu kā iepriekš.

execv () Sistēmas funkcija:

Funkcijā execl () izpildāmā faila parametri tiek nodoti funkcijai kā dažādi argumenti. Izmantojot execv (), jūs varat nodot visus parametrus NULL izbeigtajā masīvā argv . Masīva pirmajam elementam jābūt izpildāmā faila ceļam. Pretējā gadījumā funkcija execv () darbojas tāpat kā execl ().

Sintakse:

intizpild(konst char *ceļš, char *konstargv[]);

Mēs varam pārrakstīt execl () piemēru šādi:

#iekļaut

intgalvenais(spēkā neesošs) {
char *binaryPath= ' / bin / ls';
char *args[] = {binaryPath, '' lh '', '/mājas',NULL};

izpild(binaryPath,args);

atgriezties 0;
}

Kā redzat, es saņemu pareizo rezultātu.

execvp () Sistēmas funkcija:

Darbojas tāpat kā execv () sistēmas funkcija. Bet tiek izmantots vides mainīgais PATH. Tātad, izpildāmā faila pilns ceļš nav nepieciešams tāpat kā execlp ().

Sintakse:

intizpildītājs(konst char *failu, char *konstargv[]);

Mēs varam pārrakstīt execv () piemēru šādi:

#iekļaut

intgalvenais(spēkā neesošs) {
char *programName= 'ls';
char *args[] = {programName, '' lh '', '/mājas',NULL};

izpildītājs(programName,args);

atgriezties 0;
}

Kā redzat, tiek parādīta pareizā izvade.

execle () Sistēmas funkcija:

Darbojas tāpat kā execl (), taču kopā ar to varat norādīt arī savus vides mainīgos. Vides mainīgie tiek nodoti kā masīvs envp . Pēdējais elements envp masīvam jābūt NULL. Visos pārējos elementos kā virkne ir ietverti atslēgu un vērtību pāri.

Sintakse:

intekseleklis(konst char *ceļš, konst char *dusmīgs,...,NULL, char * konstenvp[] );

Tālāk ir sniegts sistēmas funkcijas execle () piemērs:

#iekļaut

intgalvenais(spēkā neesošs) {
char *binaryPath= '/bin/bash';
char *arg1= '-c';
char *arg2= 'izmest ārā 'Apmeklējiet $ HOSTNAME:$ PORT no jūsu pārlūkprogrammas.'';
char *konstenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NULL};

ekseleklis(binaryPath,binaryPath,arg1,arg2,NULL,env);

atgriezties 0;
}

Es izturēju divus vides mainīgos HOSTNAME un Ostas uz funkciju execle (). Kā redzat, es varu tiem piekļūt no izpildāmā faila /bin/bash .

execve () Sistēmas funkcija:

Tāpat kā execle (), kopā ar execve () varat norādīt arī savus vides mainīgos. Varat arī nodot argumentus kā masīvus, kā to darījāt failā execv ().

Sintakse:

intizpildīt(konst char *failu, char *konstargv[], char *konstenvp[]);

Execle () piemēru var pārrakstīt šādi:

#iekļaut

intgalvenais(spēkā neesošs) {
char *binaryPath= '/bin/bash';
char *konstargs[] = {binaryPath, '-c', 'izmest ārā 'Apmeklējiet $ HOSTNAME:$ PORT
no jūsu pārlūkprogrammas.'',NULL};
char *konstenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NULL};

izpildīt(binaryPath,args,env);

atgriezties 0;
}

Kā redzat, mēs iegūstam tādu pašu izvadi kā execle () piemērā.

Tātad, tā jūs izmantojat izpildes funkciju saimi C sistēmas programmēšanai Linux. Paldies, ka izlasījāt šo rakstu.