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ímNULL
. -
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žeNULL
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 vl
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 jakoargv
pole:pole proexecve()
, samostatné argumenty proexecle()
. -
Volání s
p
v názvu vyhledejtePATH
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ýmP
). Toto je jakoexecvp()
, ale místo získání vyhledávací cesty zPATH
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