GNU/Linux >> Znalost Linux >  >> Linux

Jaký je rozdíl mezi funkcemi rodiny systémových volání exec, jako je exec a execve?

Neexistuje žádný exec systémové volání -- toto se obvykle používá k označení všech execXX volá jako skupina. Všichni dělají v podstatě totéž:načítají nový program do aktuálního procesu a poskytují mu argumenty a proměnné prostředí. Rozdíly jsou v tom, jak je program nalezen, jak jsou specifikovány argumenty a odkud pochází prostředí.

  • Volání s v v názvu vezměte parametr pole specifikující argv[] pole nového programu. Konec argumentů je označen prvkem pole obsahujícím NULL .

  • Volání s l v názvu vezměte argumenty nového programu jako seznam argumentů s proměnnou délkou k samotné funkci. Konec argumentů je označen (char *)NULL argument. Vždy byste měli zahrnout typové obsazení, protože NULL je povoleno být celočíselnou konstantou a výchozí konverze argumentů při volání variadické funkce ji nepřevedou na ukazatel.

  • Volání s e v názvu vezměte další argument (nebo argumenty v l case) poskytnout prostředí nového programu; jinak program zdědí prostředí aktuálního procesu. Toto je poskytováno stejným způsobem jako argv pole:pole pro execve() , samostatné argumenty pro execle() .

  • Volání s p v názvu vyhledejte PATH proměnná prostředí k nalezení programu, pokud v něm není adresář (tj. neobsahuje / charakter). Jinak je název programu vždy považován za cestu ke spustitelnému souboru.

  • FreeBSD 5.2 přidal další variantu:execvP (s velkým P ). Toto je jako execvp() , ale místo získání vyhledávací cesty z PATH prostředí, je to explicitní parametr funkce:

int execvP(const char *file, const char *search_path, char *const argv[]);

Použijte man exec a přečtěte si:

The execv(), execvp(), and execvpe() functions provide an array of pointers to 
null-terminated strings that represent the argument list available to the new program. 
The first argument, by convention, should point to the filename associated with the file 
being executed. The array of pointers must be terminated by a NULL pointer. 

execv

int execv(const char *path, char *const argv[]);

Takže předáte pole jako parametry

int execle(const char *path, const char *arg,
              ..., char * const envp[]);

Téměř totéž, ale ne jako pole, ale spíše jako seznam hodnot (řetězců), za nimiž následuje pole, které označuje prostředí.

Zde:

int execvp(const char *file, char *const argv[]);

Voláte soubor bez cesty, takže očekává, že jste již ve správném path před zavoláním.

V neposlední řadě:

int execve(const char *filename, char *const argv[],
                  char *const envp[]);

Podobné jako předchozí, ale nyní máte dvě pole pro argumenty a proměnné prostředí.


Protože všechny tyto funkce patří do rodiny exec(), dovolte mi differentiate podle extra characters s významy,

1.execve ():

p :not present => název programu, který se má spustit, bude převzat z pathname

v :argument present => bude předán jako array

e :present => prostředí bude převzato z envp argument

2.execle ():

p :not present => název programu, který se má spustit, bude převzat z pathname

l :present => argument bude předán jako list

e :present => prostředí bude převzato z envp argument

3.execlp ():

p :present => název programu, který se má spustit, bude převzat z filename nebo systém bude search for program file v PATH variabilní.

l :present => argument bude předán jako list

e :not present => prostředí bude převzato z caller's environ

4.execvp ():

p :present => název programu, který se má spustit, bude převzat z filename nebo systém bude search for program file v PATH variabilní.

v :argument present => bude předán jako array

e :not present => prostředí bude převzato z caller's environ

5.execv ():

p :not present => název programu, který se má spustit, bude převzat z pathname

v :argument present => bude předán jako array

e :not present => prostředí bude převzato z caller's environ

6.execl ():

p :not present => název programu, který se má spustit, bude převzat z pathname

l :present => argument bude předán jako list

e :not present => prostředí bude převzato z caller's environ


Linux
  1. Jaký je rozdíl mezi InnoDB a MyISAM?

  2. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  3. Jaký je rozdíl mezi procfs a sysfs?

  1. Jaký je rozdíl mezi fsck a e2fsck?

  2. Jaký je rozdíl mezi ls a l?

  3. Jaký je rozdíl mezi pravděpodobnými a nepravděpodobnými voláními v jádře?

  1. Jaký je rozdíl mezi adduser a useradd?

  2. Jaký je rozdíl mezi voláním knihovny a voláním systému v Linuxu?

  3. Jaký je rozdíl mezi `su -` a `su --login`?