GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la differenza tra le funzioni della famiglia exec di chiamate di sistema come exec ed execve?

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 il argv[] matrice del nuovo programma. La fine degli argomenti è indicata da un elemento dell'array contenente NULL .

  • 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 nel l 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 del argv array:un array per execve() , argomenti separati per execle() .

  • Le chiamate con p nel nome cerca il PATH 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 (con P maiuscolo ). Questo è come execvp() , ma invece di ottenere il percorso di ricerca da PATH 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


Linux
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. Qual è la differenza tra strtok_r e strtok_s in C?

  3. Qual è la differenza tra adduser e useradd?

  4. Qual è la differenza tra una chiamata di libreria e una chiamata di sistema in Linux?

  5. Qual è la differenza tra `su -` e `su --login`?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Che cosa sono le chiamate di sistema Linux e le funzioni di libreria?

Qual è la differenza tra chiamata di sistema e chiamata di libreria?