Non c'è exec
chiamata di sistema -- questo è solitamente usato per fare riferimento a tutti i execXX
chiamate in gruppo. Fanno tutti essenzialmente la stessa cosa:caricare un nuovo programma nel processo corrente e fornirgli argomenti e variabili d'ambiente. Le differenze sono nel modo in cui viene trovato il programma, come vengono specificati gli argomenti e da dove proviene l'ambiente.
-
Le chiamate con
v
nel nome prendi un parametro di matrice per specificare ilargv[]
matrice del nuovo programma. La fine degli argomenti è indicata da un elemento dell'array contenenteNULL
. -
Le chiamate con
l
nel nome accetta gli argomenti del nuovo programma come un elenco di argomenti di lunghezza variabile per la funzione stessa. La fine degli argomenti è indicata da un(char *)NULL
discussione. Dovresti sempre includere il cast del tipo, perchéNULL
può essere una costante intera e le conversioni di argomenti predefinite quando si chiama una funzione variadica non la convertiranno in un puntatore. -
Le chiamate con
e
nel nome accetta un argomento extra (o argomenti nell
caso) per fornire l'ambiente del nuovo programma; in caso contrario, il programma eredita l'ambiente del processo corrente. Questo viene fornito allo stesso modo delargv
array:un array perexecve()
, argomenti separati perexecle()
. -
Le chiamate con
p
nel nome cerca ilPATH
variabile d'ambiente per trovare il programma se non contiene una directory (cioè non contiene un/
carattere). In caso contrario, il nome del programma viene sempre trattato come un percorso dell'eseguibile. -
FreeBSD 5.2 ha aggiunto un'altra variante:
execvP
(conP
maiuscolo ). Questo è comeexecvp()
, ma invece di ottenere il percorso di ricerca daPATH
variabile d'ambiente, è un parametro esplicito della funzione:
int execvP(const char *file, const char *search_path, char *const argv[]);
Usa man exec
e leggi:
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[]);
Quindi passi un array come parametri
int execle(const char *path, const char *arg,
..., char * const envp[]);
Quasi lo stesso, ma non come un array, ma piuttosto come un elenco di valori (stringhe), seguito da un array che designa l'ambiente.
Qui:
int execvp(const char *file, char *const argv[]);
Stai chiamando un file, senza percorso, quindi si aspetta che tu sia già nel path
corretto prima di chiamare.
Ultimo ma non meno importante:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Simile al precedente, ma ora hai due array, per argomenti e variabili d'ambiente.
Dato che tutte queste funzioni appartengono alla famiglia exec(), lasciatemi differentiate
secondo extra characters
con i significati,
1.execve ():
p :non presente => il nome del programma da eseguire sarà preso da pathname
v :present => l'argomento sarà passato come array
e :present => l'ambiente sarà preso da envp argument
2.execle ():
p :non presente => il nome del programma da eseguire sarà preso da pathname
l :present => l'argomento verrà passato come list
e :presente => l'ambiente sarà preso da envp argument
3.execlp ():
p :presente => il nome del programma da eseguire sarà preso da filename
specificato o il sistema search for program file
in PATH
variabile.
l :present => l'argomento sarà passato come list
e :not present => l'ambiente sarà preso da caller's environ
4.execvp ():
p :presente => il nome del programma da eseguire sarà preso da filename
specificato o il sistema search for program file
in PATH
variabile.
v :present => l'argomento sarà passato come array
e :not present => l'ambiente sarà preso da caller's environ
5.execv ():
p :non presente => il nome del programma da eseguire sarà preso da pathname
v :present => l'argomento sarà passato come array
e :not present => l'ambiente sarà preso da caller's environ
6.execl ():
p :non presente => il nome del programma da eseguire sarà preso da pathname
l :present => l'argomento sarà passato come list
e :not present => l'ambiente sarà preso da caller's environ