Rendszerhívás végrehajtása C -ben

Exec System Call C



A végrehajtó család számos funkciót tartalmaz a C -ben. Ezeket a C függvényeket alapvetően arra használják, hogy egy rendszerparancsot futtassanak egy külön folyamatban, amely a fő program, és a kimenet nyomtatása.

Ebben a cikkben a végrehajtó függvénycsaládról fogok beszélni, és megmutatom, hogyan kell használni ezeket a végrehajtó családfunkciókat a C -ben. Tehát kezdjük.





C Rendszerfunkciók az Exec családban:

A végrehajtási függvénycsaládokat a fejléc határozza meg unistd.h . Tehát ezt a fejlécet kell használnia a C programban, ahol ezeket a funkciókat használni szeretné.



A rendelkezésre álló végrehajtási függvények és azok paraméterei az alábbiakban találhatók:



  • int execl (const char *elérési út, const char *arg,…, NULL);
  • int execlp (const char *fájl, const char *arg,…, NULL);
  • int execv (const char *útvonal, char *const argv []);
  • int execvp (const char *fájl, char *const argv []);
  • int execle (const char *path, const char *arg,…, NULL, char *const envp []);
  • int execve (const char *fájl, char *const argv [], char *const envp []);

Nézzük meg, mit tesznek ezek a funkciók, és hogyan kell használni őket.





execl () Rendszerfunkció:

Az execl () programban a rendszerfüggvény a végrehajtható bináris fájl elérési útját (azaz / bin / ls ) első és második érvként. Ezután az érvek (pl. -lh , /itthon ), amelyet át szeretne adni a futtatható fájlnak, amelyet követ NULLA . Ezután az execl () rendszerfüggvény futtatja a parancsot, és kinyomtatja a kimenetet. Ha bármilyen hiba történik, akkor az execl () -1 értéket ad vissza. Ellenkező esetben nem ad vissza semmit.

Szintaxis:

intvégrehajt(const char *pálya, const char *mérges,...,NULLA);

Az Execl () rendszerműveletre egy példa található az alábbiakban:



#befoglalni

intfő-(üres) {
char *binaryPath= ' / bin / ls';
char *arg1= '-lh';
char *arg2= '/itthon';

végrehajt(binaryPath,binaryPath,arg1,arg2,NULLA);

Visszatérés 0;
}

Futottam a ls -lh / haza parancs az execl () rendszerművelet használatával. Mint látható, a helyes eredmény jelenik meg.

execlp () Rendszerfunkció:

Az execl () nem használja a PÁLYA környezeti változó. Tehát a végrehajtható fájl teljes elérési útja szükséges a execl () fájllal való futtatáshoz. Az execlp () a PATH környezeti változót használja. Tehát, ha egy futtatható fájl vagy parancs elérhető a PATH -ban, akkor a parancs vagy a fájlnév elegendő a futtatásához, a teljes elérési útra nincs szükség.

Szintaxis:

intexeclp(const char *fájlt, const char *mérges,...,NULLA);

Az execlp () példát az execlp () rendszerfüggvény segítségével írhatjuk át az alábbiak szerint:

#befoglalni

intfő-(üres) {
char *programName= 'van';
char *arg1= '-lh';
char *arg2= '/itthon';

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

Visszatérés 0;
}

Csak a parancs nevét adtam meg ls , nem a teljes út / bin / ls . Mint látható, ugyanazt a kimenetet kaptam, mint korábban.

execv () Rendszerfunkció:

Az execl () függvényben a végrehajtható fájl paraméterei különböző argumentumként kerülnek átadásra a függvénynek. Az execv () segítségével átadhatja az összes paramétert egy NULL terminált tömbben argv . A tömb első eleme a végrehajtható fájl elérési útja legyen. Ellenkező esetben a execv () függvény ugyanúgy működik, mint az execl () függvény.

Szintaxis:

intexecv(const char *pálya, char *constargv[]);

Az execl () példát a következőképpen írhatjuk át:

#befoglalni

intfő-(üres) {
char *binaryPath= ' / bin / ls';
char *args[] = {binaryPath, '-lh', '/itthon',NULLA};

execv(binaryPath,args);

Visszatérés 0;
}

Amint látja, a megfelelő kimenetet kapom.

execvp () Rendszerfunkció:

Ugyanúgy működik, mint az execv () rendszerfüggvény. De a PATH környezeti változót használják. Tehát a végrehajtható fájl teljes elérési útja nem szükséges, mint a execlp ().

Szintaxis:

intexecvp(const char *fájlt, char *constargv[]);

Az execv () példát a következőképpen írhatjuk át:

#befoglalni

intfő-(üres) {
char *programName= 'van';
char *args[] = {programName, '-lh', '/itthon',NULLA};

execvp(programName,args);

Visszatérés 0;
}

Mint látható, a megfelelő kimenet jelenik meg.

execle () Rendszerfunkció:

Ugyanúgy működik, mint az execl (), de megadhatja saját környezeti változóit is. A környezeti változók tömbként kerülnek átadásra envp . Az utolsó elem a envp tömb NULL legyen. Az összes többi elem tartalmazza a kulcs-érték párokat karakterláncként.

Szintaxis:

intexecle(const char *pálya, const char *mérges,...,NULLA, char * constenvp[] );

Az execle () rendszerfüggvény példája az alábbiakban található:

#befoglalni

intfő-(üres) {
char *binaryPath= '/bin/bash';
char *arg1= '-c';
char *arg2= 'kidobta'Látogassa meg a $ HOSTNAME webhelyet:$ PORT a böngészőből.'';
char *constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NULLA};

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

Visszatérés 0;
}

Két környezeti változót adtam át HOSTNAME és KIKÖTŐ az execle () függvényhez. Amint látja, a végrehajtható fájlból férhetek hozzá /bin/bash .

execve () Rendszerfunkció:

Csakúgy, mint az execle (), az execve () mellett megadhatja saját környezeti változóit is. Az argumentumokat tömbként is átadhatja, mint az execv () fájlban.

Szintaxis:

intvégrehajtani(const char *fájlt, char *constargv[], char *constenvp[]);

Az execle () példa a következőképpen írható át:

#befoglalni

intfő-(üres) {
char *binaryPath= '/bin/bash';
char *constargs[] = {binaryPath, '-c', 'kidobta'Látogassa meg a $ HOSTNAME webhelyet:$ PORT
a böngészőből.'',NULLA};
char *constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NULLA};

végrehajtani(binaryPath,args,env);

Visszatérés 0;
}

Amint láthatja, ugyanazt a kimenetet kapjuk, mint az execle () példában.

Tehát így használja a C végrehajtási függvénycsaládját a C rendszerben a Linux programozásához. Köszönjük, hogy elolvasta ezt a cikket.