GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre les fonctions de la famille exec d'appels système comme exec et execve ?

Il n'y a pas de exec appel système -- ceci est généralement utilisé pour faire référence à tous les execXX appels en groupe. Ils font tous essentiellement la même chose :charger un nouveau programme dans le processus en cours et lui fournir des arguments et des variables d'environnement. Les différences résident dans la manière dont le programme est trouvé, la manière dont les arguments sont spécifiés et la provenance de l'environnement.

  • Les appels avec v dans le nom prendre un paramètre tableau pour spécifier le argv[] tableau du nouveau programme. La fin des arguments est indiquée par un élément de tableau contenant NULL .

  • Les appels avec l dans le nom prend les arguments du nouveau programme comme une liste d'arguments de longueur variable à la fonction elle-même. La fin des arguments est indiquée par un (char *)NULL dispute. Vous devez toujours inclure le cast de type, car NULL est autorisé à être une constante entière, et les conversions d'arguments par défaut lors de l'appel d'une fonction variadique ne le convertiront pas en pointeur.

  • Les appels avec e dans le nom prendre un argument supplémentaire (ou des arguments dans le l cas) pour fournir l'environnement du nouveau programme ; sinon, le programme hérite de l'environnement du processus courant. Ceci est fourni de la même manière que le argv array :un tableau pour execve() , arguments séparés pour execle() .

  • Les appels avec p dans le nom chercher le PATH variable d'environnement pour trouver le programme s'il ne contient pas de répertoire (c'est-à-dire qu'il ne contient pas de / personnage). Sinon, le nom du programme est toujours traité comme un chemin vers l'exécutable.

  • FreeBSD 5.2 a ajouté une autre variante :execvP (avec majuscule P ). C'est comme execvp() , mais au lieu d'obtenir le chemin de recherche à partir du PATH variable d'environnement, c'est un paramètre explicite de la fonction :

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

Utilisez man exec et lisez :

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[]);

Vous passez donc un tableau en paramètre

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

Presque la même chose, mais pas sous forme de tableau, mais plutôt sous forme de liste de valeurs (chaînes), suivie d'un tableau qui désigne l'environnement.

Ici :

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

Vous appelez un fichier, sans chemin, il s'attend donc à ce que vous soyez déjà dans le bon path avant d'appeler.

Dernier point mais non le moindre :

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

Semblable au précédent, mais vous avez maintenant deux tableaux, pour les arguments et les variables d'environnement.


Puisque toutes ces fonctions appartiennent à la famille exec(), laissez-moi differentiate selon extra characters avec les significations,

1.execve ():

p :absent => le nom du programme à exécuter sera tiré de pathname

v :présent => l'argument sera passé sous la forme array

e :present => l'environnement sera repris de envp argument

2.execfichier ():

p :absent => le nom du programme à exécuter sera tiré de pathname

l :présent => l'argument sera passé sous la forme list

e :present => l'environnement sera repris de envp argument

3.execlp ():

p :présent => le nom du programme à exécuter sera tiré de filename spécifié ou le système search for program file en PATH variable.

l :présent => l'argument sera passé sous la forme list

e :absent => l'environnement sera extrait de caller's environ

4.execvp ():

p :présent => le nom du programme à exécuter sera tiré de filename spécifié ou le système search for program file en PATH variable.

v :présent => l'argument sera passé sous la forme array

e :absent => l'environnement sera extrait de caller's environ

5.execv ():

p :absent => le nom du programme à exécuter sera extrait de pathname

v :présent => l'argument sera passé sous la forme array

e :absent => l'environnement sera extrait de caller's environ

6.execl ():

p :absent => le nom du programme à exécuter sera tiré de pathname

l :présent => l'argument sera passé sous la forme list

e :absent => l'environnement sera extrait de caller's environ


Linux
  1. Différence entre les appels système statvfs() et statfs() ?

  2. Quelle est la différence entre strtok_r et strtok_s en C ?

  3. Quelle est la différence entre fsck et e2fsck ?

  4. Quelle est la différence entre un appel Library et un appel System sous Linux ?

  5. Quelle est la différence entre `su -` et `su --login` ?

Quelle est la différence entre Linux et Unix ?

Quelle est la différence entre la connexion et le shell sans connexion

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Qu'est-ce que les appels système Linux et les fonctions de bibliothèque ?

Quelle est la différence entre un appel système et un appel de bibliothèque ?