Suorita järjestelmäpuhelu C: ssä

Exec System Call C

Exec -perheellä on monia toimintoja C. Näitä C -toimintoja käytetään pohjimmiltaan järjestelmän komennon suorittamiseen erillisessä prosessissa, joka on pääohjelma ja tulostus.

Tässä artikkelissa aion puhua exec -funktioperheestä ja näyttää, kuinka voit käyttää kutakin näistä exec -perheen funktioista C. Joten aloitetaan.



C Exec -perheen järjestelmän toiminnot:

Suoritusfunktioperheet määritellään otsikossa tunnistamaton. h . Sinun on siis käytettävä tätä otsikkoa C -ohjelmassa, jossa haluat käyttää näitä toimintoja.



Käytettävissä olevat suoritustoiminnot ja niiden parametrit on lueteltu alla:



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

Katsotaanpa, mitä kukin näistä toiminnoista tekee ja miten niitä käytetään.

execl () Järjestelmän toiminto:

In execl () järjestelmätoiminto kulkee suoritettavan binaaritiedoston polun (eli / bin / ls ) ensimmäisenä ja toisena argumenttina. Sitten argumentit (esim. -lh , /Koti ), jonka haluat siirtää suoritettavaan tiedostoon ja jota seuraa TYHJÄ . Sitten execl () -toiminto suorittaa komennon ja tulostaa tuloksen. Jos tapahtuu virhe, execl () palauttaa -1. Muuten se ei palauta mitään.

Syntaksi:

intsuoritus(const hiiltyä *polku, const hiiltyä *vihainen,...,TYHJÄ);

Alla on esimerkki execl () -toiminnosta:



#sisältää

inttärkein(mitätön) {
hiiltyä *binaryPath= ' / bin / ls';
hiiltyä *arg1= '' lh '';
hiiltyä *arg2= '/Koti';

suoritus(binaryPath,binaryPath,arg1,arg2,TYHJÄ);

palata 0;
}

Juoksin ls -lh / koti komento execl () -toimintoa käyttäen. Kuten näette, oikea tulos näytetään.

execlp () Järjestelmän toiminto:

execl () ei käytä PATH ympäristömuuttuja. Joten suoritettavan tiedoston koko polku vaaditaan sen suorittamiseen execl (): n kanssa. execlp () käyttää PATH -ympäristömuuttujaa. Joten jos suoritettava tiedosto tai komento on käytettävissä PATH: ssa, komento tai tiedostonimi riittää sen suorittamiseen, koko polkua ei tarvita.

Syntaksi:

intexeclp(const hiiltyä *tiedosto, const hiiltyä *vihainen,...,TYHJÄ);

Voimme kirjoittaa esimerkin execl () uudelleen käyttämällä execlp () -järjestelmätoimintoa seuraavasti:

#sisältää

inttärkein(mitätön) {
hiiltyä *ohjelmanNimi= 'on';
hiiltyä *arg1= '' lh '';
hiiltyä *arg2= '/Koti';

execlp(ohjelmanNimi,ohjelmanNimi,arg1,arg2,TYHJÄ);

palata 0;
}

Välitin vain komennon nimen ls , ei koko polku / bin / ls . Kuten näette, sain saman tuloksen kuin ennen.

execv () Järjestelmän toiminto:

Funktiossa execl () suoritettavan tiedoston parametrit välitetään funktiolle eri argumentteina. Execv (): n avulla voit välittää kaikki parametrit NULL -päätteisessä taulukossa argv . Taulukon ensimmäisen elementin tulisi olla suoritettavan tiedoston polku. Muussa tapauksessa execv () -toiminto toimii kuten execl () -toiminto.

Syntaksi:

intexecv(const hiiltyä *polku, hiiltyä *constargv[]);

Voimme kirjoittaa esimerkin execl () uudelleen seuraavasti:

#sisältää

inttärkein(mitätön) {
hiiltyä *binaryPath= ' / bin / ls';
hiiltyä *args[] = {binaryPath, '' lh '', '/Koti',TYHJÄ};

execv(binaryPath,args);

palata 0;
}

Kuten näette, saan oikean tuloksen.

execvp () Järjestelmän toiminto:

Toimii samalla tavalla kuin execv () -järjestelmätoiminto. PATH -ympäristömuuttujaa käytetään kuitenkin. Joten suoritettavan tiedoston koko polkua ei vaadita aivan kuten execlp ().

Syntaksi:

intexecvp(const hiiltyä *tiedosto, hiiltyä *constargv[]);

Voimme kirjoittaa esimerkin execv () uudelleen seuraavasti:

#sisältää

inttärkein(mitätön) {
hiiltyä *ohjelmanNimi= 'on';
hiiltyä *args[] = {ohjelmanNimi, '' lh '', '/Koti',TYHJÄ};

execvp(ohjelmanNimi,args);

palata 0;
}

Kuten näette, oikea lähtö näytetään.

execle () Järjestelmän toiminto:

Toimii kuten execl (), mutta voit antaa omat ympäristömuuttujasi sen mukana. Ympäristömuuttujat välitetään matriisina envp . Viimeinen elementti envp taulukon pitäisi olla NULL. Kaikki muut elementit sisältävät avain-arvo-parit merkkijonona.

Syntaksi:

intexecle(const hiiltyä *polku, const hiiltyä *vihainen,...,TYHJÄ, hiiltyä * constenvp[] );

Alla on esimerkki execle () -toiminnosta:

#sisältää

inttärkein(mitätön) {
hiiltyä *binaryPath= '/bin/bash';
hiiltyä *arg1= '' c '';
hiiltyä *arg2= 'heitti pois 'Käy osoitteessa $ HOSTNAME:$ PORT selaimestasi.'';
hiiltyä *constenv[] = {'HOSTNAME = www.linuxhint.com', 'SATAMA = 8080',TYHJÄ};

execle(binaryPath,binaryPath,arg1,arg2,TYHJÄ,env);

palata 0;
}

Ohitin kaksi ympäristömuuttujaa Isäntä ja SATAMA execle () -toimintoon. Kuten näette, voin käyttää niitä suoritettavasta tiedostosta /bin/bash .

execve () Järjestelmän toiminto:

Aivan kuten execle (), voit antaa omat ympäristömuuttujasi yhdessä execve (): n kanssa. Voit myös välittää argumentteja matriiseina kuten suorittimessa execv ().

Syntaksi:

intsuorittaa(const hiiltyä *tiedosto, hiiltyä *constargv[], hiiltyä *constenvp[]);

Esimerkki execle () voidaan kirjoittaa uudelleen seuraavasti:

#sisältää

inttärkein(mitätön) {
hiiltyä *binaryPath= '/bin/bash';
hiiltyä *constargs[] = {binaryPath, '' c '', 'heitti pois 'Käy osoitteessa $ HOSTNAME:$ PORT
selaimestasi.'',TYHJÄ};
hiiltyä *constenv[] = {'HOSTNAME = www.linuxhint.com', 'SATAMA = 8080',TYHJÄ};

suorittaa(binaryPath,args,env);

palata 0;
}

Kuten näette, saamme saman tuloksen kuin esimerkissä execle ().

Käytät siis C: n exec -funktioperhettä järjestelmän ohjelmointiin Linuxissa. Kiitos tämän artikkelin lukemisesta.