Systémový hovor Exec v C

Exec System Call C



Rodina exec má mnoho funkcií v jazyku C. Tieto funkcie C sa v zásade používajú na spustenie systémového príkazu v samostatnom procese, v ktorom hlavný program a tlač výstupu.

V tomto článku budem hovoriť o rodine funkcií exec a ukážem vám, ako používať každú z týchto funkcií rodiny exec v jazyku C. Začnime teda.







Funkcie systému C v rodine Exec:

V hlavičke sú definované rodiny funkcií exec unistd.h . Takže musíte použiť túto hlavičku v programe C, kde chcete používať tieto funkcie.



Dostupné funkcie exec spolu s ich funkčnými parametrami sú uvedené nižšie:



  • int execl (const char *cesta, const char *arg, ..., NULL);
  • int execlp (súbor const char *, const char *arg, ..., NULL);
  • int execv (const char *cesta, char *const argv []);
  • int execvp (súbor const char *, char *const argv []);
  • int execle (const char *cesta, const char *arg, ..., NULL, char *const envp []);
  • int execve (súbor const char *, char *const argv [], char *const envp []);

Pozrime sa, čo každá z týchto funkcií robí a ako ich používať.





execl () Funkcia systému:

V systéme execl () systémová funkcia preberá cestu k spustiteľnému binárnemu súboru (t.j. / bin / ls ) ako prvý a druhý argument. Potom argumenty (t.j. -lh , /Domov ), ktoré chcete prejsť do spustiteľného súboru, za ktorým nasleduje NULOVÝ . Potom systémová funkcia execl () spustí príkaz a vytlačí výstup. Ak sa vyskytne nejaká chyba, potom execl () vráti -1. V opačnom prípade nič nevracia.

Syntax:

intpopraviť(konšt char *cesta, konšt char *nahnevaný,...,NULOVÝ);

Príklad systémovej funkcie execl () je uvedený nižšie:



#zahrnúť

intHlavná(prázdny) {
char *binaryPath= ' / bin / ls';
char *arg1= '-lh';
char *arg2= '/Domov';

popraviť(binaryPath,binaryPath,arg1,arg2,NULOVÝ);

vrátiť sa 0;
}

Bežal som ls -lh / domov príkaz pomocou systémovej funkcie execl (). Ako vidíte, zobrazí sa správny výsledok.

execlp () Funkcia systému:

execl () nepoužíva príponu PATH premenná prostredia. Na spustenie pomocou príkazu execl () je teda potrebná úplná cesta k spustiteľnému súboru. execlp () používa premennú prostredia PATH. Ak je teda v PATH k dispozícii spustiteľný súbor alebo príkaz, potom na jeho spustenie stačí príkaz alebo názov súboru, úplná cesta nie je potrebná.

Syntax:

intexeclp(konšt char *súbor, konšt char *nahnevaný,...,NULOVÝ);

Príklad execl () pomocou systémovej funkcie execlp () môžeme prepísať nasledovne:

#zahrnúť

intHlavná(prázdny) {
char *programName= 'ls';
char *arg1= '-lh';
char *arg2= '/Domov';

execlp(programName,programName,arg1,arg2,NULOVÝ);

vrátiť sa 0;
}

Prešiel som iba názov príkazu ls , nie úplnú cestu / bin / ls . Ako vidíte, dostal som rovnaký výstup ako predtým.

execv () Funkcia systému:

Vo funkcii execl () sú parametre spustiteľného súboru odoslané do funkcie ako rôzne argumenty. S execv () môžete odovzdať všetky parametre v poli zakončenom NULL argv . Prvým prvkom poľa by mala byť cesta k spustiteľnému súboru. V opačnom prípade funkcia execv () funguje rovnako ako funkcia execl ().

Syntax:

intvykon(konšt char *cesta, char *konštargv[]);

Príklad execl () môžeme prepísať nasledovne:

#zahrnúť

intHlavná(prázdny) {
char *binaryPath= ' / bin / ls';
char *args[] = {binaryPath, '-lh', '/Domov',NULOVÝ};

vykon(binaryPath,args);

vrátiť sa 0;
}

Ako vidíte, dostávam správny výstup.

execvp () Funkcia systému:

Funguje rovnako ako systémová funkcia execv (). Ale používa sa premenná prostredia PATH. Úplná cesta spustiteľného súboru sa teda nevyžaduje rovnako ako v execlp ().

Syntax:

intexecvp(konšt char *súbor, char *konštargv[]);

Príklad execv () môžeme prepísať nasledovne:

#zahrnúť

intHlavná(prázdny) {
char *programName= 'ls';
char *args[] = {programName, '-lh', '/Domov',NULOVÝ};

execvp(programName,args);

vrátiť sa 0;
}

Ako vidíte, zobrazuje sa správny výstup.

execle () Funkcia systému:

Funguje rovnako ako execl (), ale môžete s ním poskytnúť aj vlastné premenné prostredia. Premenné prostredia sa odovzdávajú ako pole envp . Posledný prvok súboru envp pole by malo byť NULL. Všetky ostatné prvky obsahujú ako reťazec páry kľúč-hodnota.

Syntax:

intpopraviť(konšt char *cesta, konšt char *nahnevaný,...,NULOVÝ, char * konštenvp[] );

Príklad systémovej funkcie execle () je uvedený nižšie:

#zahrnúť

intHlavná(prázdny) {
char *binaryPath= '/bin/bash';
char *arg1= '-c';
char *arg2= 'zahodil 'Navštívte $ HOSTNAME:$ PORT z vášho prehliadača.'';
char *konštenv[] = {'HOSTNAME = www.linuxhint.com', „PORT = 8080“,NULOVÝ};

popraviť(binaryPath,binaryPath,arg1,arg2,NULOVÝ,env);

vrátiť sa 0;
}

Prešiel som dvoma premennými prostredia MENO HOSŤA a PORT do funkcie execle (). Ako vidíte, mám k nim prístup z spustiteľného súboru /bin/bash .

execve () Funkcia systému:

Rovnako ako execle () môžete poskytnúť svoje vlastné premenné prostredia spolu s execve (). Argumenty môžete tiež odosielať ako polia, ako ste to urobili v execv ().

Syntax:

intpopraviť(konšt char *súbor, char *konštargv[], char *konštenvp[]);

Príklad execle () je možné prepísať nasledovne:

#zahrnúť

intHlavná(prázdny) {
char *binaryPath= '/bin/bash';
char *konštargs[] = {binaryPath, '-c', 'zahodil 'Navštívte $ HOSTNAME:$ PORT
z vášho prehliadača.'',NULOVÝ};
char *konštenv[] = {'HOSTNAME = www.linuxhint.com', „PORT = 8080“,NULOVÝ};

popraviť(binaryPath,args,env);

vrátiť sa 0;
}

Ako vidíte, dostaneme rovnaký výstup ako v príklade execle ().

Takto teda použijete rodinu funkcií exec v C na programovanie systému v Linuxe. Ďakujem za prečítanie tohto článku.