Vykdyti sistemos skambutį C

Exec System Call C



„Exec“ šeima turi daug funkcijų C. Šios C funkcijos iš esmės naudojamos paleisti sistemos komandą atskirame procese, kuris yra pagrindinė programa, ir spausdinti išvestį.

Šiame straipsnyje aš kalbėsiu apie „Exec“ funkcijų šeimą ir parodysiu, kaip naudoti kiekvieną iš šių „Exec“ šeimos funkcijos funkcijų C. Taigi, pradėkime.







C Sistemos funkcijos „Exec“ šeimoje:

Vykdomųjų funkcijų šeimos yra apibrėžtos antraštėje neprilygstama.h . Taigi, šią antraštę turite naudoti C programoje, kurioje norite naudoti šias funkcijas.



Galimos vykdomosios funkcijos ir jų funkcijų parametrai pateikti žemiau:



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

Pažiūrėkime, ką daro kiekviena iš šių funkcijų ir kaip jas naudoti.





execl () Sistemos funkcija:

Sistemoje execl () sistemos funkcija eina vykdomojo dvejetainio failo keliu (t.y. / bin / ls ) kaip pirmasis ir antrasis argumentas. Tada argumentai (t.y. -lh , /namai ), kurį norite perkelti į vykdomąjį failą, po kurio eina NULL . Tada „execl ()“ sistemos funkcija paleidžia komandą ir spausdina išvestį. Jei įvyksta kokia nors klaida, tada execl () grąžina -1. Priešingu atveju jis nieko negrąžina.

Sintaksė:

tarptvykd(konst anglis *kelias, konst anglis *piktas,...,NULL);

Sistemos „execl“ () funkcijos pavyzdys pateiktas žemiau:



#įtraukti

tarptpagrindinis(tuštuma) {
anglis *binaryPath= ' / bin / ls';
anglis *arg1= '-lh';
anglis *arg2= '/namai';

vykd(binaryPath,binaryPath,arg1,arg2,NULL);

grįžti 0;
}

Bėgau ls -lh / namai komanda naudojant execl () sistemos funkciją. Kaip matote, rodomas teisingas rezultatas.

execlp () Sistemos funkcija:

execl () nenaudoja PATH aplinkos kintamasis. Taigi, norint paleisti failą „execl ()“, reikalingas visas vykdomojo failo kelias. execlp () naudoja aplinkos kintamąjį PATH. Taigi, jei PATH yra vykdomasis failas ar komanda, tada norint paleisti pakanka komandos arba failo pavadinimo, viso kelio nereikia.

Sintaksė:

tarptexeclp(konst anglis *failą, konst anglis *piktas,...,NULL);

Mes galime perrašyti „execl“ () pavyzdį naudodami „execlp“ () sistemos funkciją taip:

#įtraukti

tarptpagrindinis(tuštuma) {
anglis *programName= 'yra';
anglis *arg1= '-lh';
anglis *arg2= '/namai';

execlp(programName,programName,arg1,arg2,NULL);

grįžti 0;
}

Aš perdaviau tik komandos pavadinimą ls , ne visas kelias / bin / ls . Kaip matote, aš gavau tą patį rezultatą kaip ir anksčiau.

execv () Sistemos funkcija:

Funkcijoje execl () vykdomojo failo parametrai perduodami funkcijai kaip skirtingi argumentai. Naudodami execv (), galite perduoti visus parametrus NULL baigtame masyve argv . Pirmasis masyvo elementas turėtų būti vykdomojo failo kelias. Priešingu atveju funkcija execv () veikia taip pat kaip execl ().

Sintaksė:

tarptvykd(konst anglis *kelias, anglis *konstargv[]);

„Execl“ () pavyzdį galime perrašyti taip:

#įtraukti

tarptpagrindinis(tuštuma) {
anglis *binaryPath= ' / bin / ls';
anglis *args[] = {binaryPath, '-lh', '/namai',NULL};

vykd(binaryPath,args);

grįžti 0;
}

Kaip matote, aš gaunu teisingą rezultatą.

execvp () Sistemos funkcija:

Veikia taip pat kaip ir execv () sistemos funkcija. Tačiau naudojamas aplinkos kintamasis PATH. Taigi, viso vykdomojo failo kelio nereikia, kaip ir „execlp“ ().

Sintaksė:

tarptvykd(konst anglis *failą, anglis *konstargv[]);

„Execv“ () pavyzdį galime perrašyti taip:

#įtraukti

tarptpagrindinis(tuštuma) {
anglis *programName= 'yra';
anglis *args[] = {programName, '-lh', '/namai',NULL};

vykd(programName,args);

grįžti 0;
}

Kaip matote, rodoma teisinga išvestis.

execle () sistemos funkcija:

Veikia taip pat kaip execl (), tačiau kartu galite pateikti ir savo aplinkos kintamuosius. Aplinkos kintamieji perduodami kaip masyvas envp . Paskutinis elementas envp masyvas turi būti NULL. Visuose kituose elementuose yra raktų ir verčių poros kaip eilutės.

Sintaksė:

tarptegzelis(konst anglis *kelias, konst anglis *piktas,...,NULL, anglis * konstenvp[] );

„Execle“ () sistemos funkcijos pavyzdys pateiktas žemiau:

#įtraukti

tarptpagrindinis(tuštuma) {
anglis *binaryPath= '/bin/bash';
anglis *arg1= „-c“;
anglis *arg2= 'išmetė 'Apsilankykite $ HOSTNAME:$ PORT iš naršyklės.'';
anglis *konstenv[] = {'HOSTNAME = www.linuxhint.com', „Uostas = 8080“,NULL};

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

grįžti 0;
}

Aš išlaikiau du aplinkos kintamuosius HOSTNAME ir Uostas į execle () funkciją. Kaip matote, aš galiu juos pasiekti iš vykdomosios programos /bin/bash .

execve () Sistemos funkcija:

Kaip ir „execle“ (), kartu su „execve“ () galite pateikti ir savo aplinkos kintamuosius. Taip pat galite perduoti argumentus kaip masyvus, kaip tai darėte vykdydami „execv ()“.

Sintaksė:

tarptvykdyti(konst anglis *failą, anglis *konstargv[], anglis *konstenvp[]);

Execle () pavyzdį galima perrašyti taip:

#įtraukti

tarptpagrindinis(tuštuma) {
anglis *binaryPath= '/bin/bash';
anglis *konstargs[] = {binaryPath, „-c“, 'išmetė 'Apsilankykite $ HOSTNAME:$ PORT
iš savo naršyklės.'',NULL};
anglis *konstenv[] = {'HOSTNAME = www.linuxhint.com', „Uostas = 8080“,NULL};

vykdyti(binaryPath,args,env);

grįžti 0;
}

Kaip matote, gauname tą pačią išvestį kaip ir „execle“ () pavyzdyje.

Taigi, taip jūs naudojate „Exec“ funkcijų šeimą C sistemoms programuoti „Linux“. Dėkojame, kad perskaitėte šį straipsnį.