Index général des pages de man   Index Section man 2   Table des Matières de execve   Imprime la page de man execve en mode Texte   Recherche dans les pages de man   Page de man en français      Fonctions du système (section 2)

execve

 
  

Nom

execve - Exécuter un programme.

Synopsis

#include <unistd.h>

int execve (const char *fichier, char * constargv [], char * constenvp[]);

Description

execve() exécute le programme correspondant au fichier. Celui-ci doit être un exécutable binaire ou bien un script commençant par une ligne du type "#! interpreteur [arg]". Dans ce dernier cas, l'interpréteur doit être indiqué par un nom complet, avec son chemin d'accès, et qui sera invoqué sous la forme interprèteur [arg] fichier.

argv est un tableau de chaînes d'arguments passées au nouveau programme. envp est un tableau de chaînes, ayant par convention la forme cle=valeur, qui sont passées au nouveau programme comme environnement. argv ainsi que envp doivent se terminer par un pointeur NULL. Les arguments et l'environnement sont accessibles par le nouveau programme dans sa fonction principale, lorsqu'elle est définie comme int main (int argc, char * argv [], char * envp []).

En cas de réussite, execve() ne revient pas à l'appelant, et les segments de texte, de données, ainsi que la pile du processus appelant sont remplacés par ceux du programme chargé. Le programme invoqué hérite du PID du processus appelant, et de tous les descripteurs de fichiers qui ne possèdent pas le drapeau Close-on-Exec. Les signaux en attente destinés au processus parent sont effacés. Les signaux prêts à être intercepté par le processus appelant reprennent leur comportement par défaut.

Si l'on effectuait un ptrace(2) sur le programme appelant, un signal SIGTRAP est envoyé après la réussite de execve().

Si le bit Set-UID est positionné sur le fichier du programme, l'UID effectif du processus appelant est modifié pour prendre celui du propriétaire du fichier. De même, lorsque le bit Set-GID est positionné, le GID effectif est modifié pour correspondre à celui du groupe du fichier. Si l'exécutable est un fichier binaire a.out lié dynamiquement, et contenant des appels aux bibliothèques partagées, le linker dynamique de Linux ld.so(1) est appelé avant l'exécution, afin de charger les bibliothèques partagées nécessaires en mémoire, et d'effectuer l'édition des liens de l'exécutable.

Si l'éxécutable est au format ELF lié dynamiquement, l'interprèteur indiqué dans le segment PT_INTERP sera invoqué pour charger les bibliothèques partagées. Cet interprèteur est généralement /lib/ld-linux.so.1 pour les fichiers binaires liés avec la libc Linux version 5, ou /lib/ld-linux.so.2 pour ceux liés avec la GNU libc version 2.

Valeur Renvoyée

En cas de réussite, execve() ne revient pas, en cas d'échec il renvoie -1 et errno contient le code d'erreur.

Erreurs

EACCES
Le fichier n'est pas un fichier régulier.
EACCES
L'autorisation d'exécution est refusée pour le fichier, ou un script, ou un interpréteur ELF.
EPERM
Le système de fichiers est monté avec l'attribut noexec.
EPERM
Le système de fichiers est monté avec l'attribut nosuid et le fichier a un bit Set-UID ou Set-GID positionné.
E2BIG
La liste d'arguments est trop grande.
ENOEXEC
Le fichier éxécutable n'est pas dans le bon format, ou est destiné à une autre architecture.
EFAULT
L'argument fichier pointe en dehors de l'espace d'adressage accessible.
ENAMETOOLONG
La chaîne de caractères fichier est trop longue.
ENOENT
Le fichier n'existe pas.
ENOMEM
Pas assez de mémoire pour le noyau.
ENOTDIR
Un élément du chemin d'accès n'est pas un répertoire.
ELOOP
Le chemin d'accès au fichier contient une référence circulaire (à travers un lien symbolique)
ETXTBSY
Le fichier exécutable a été ouvert en écriture par un ou plusieurs processus.
EIO
Une erreur d'entrée/sortie de bas-niveau s'est produite.
ENFILE
Le nombre maximal de fichiers ouverts sur le système est atteint
EMFILE
Le nombre maximal de fichiers ouverts par processus est atteint.
EINVAL
Un exécutable ELF a plusieurs segments PT_INTERP (indique plusieurs interprèteurs).
EISDIR
L'interprèteur ELF cité est un répertoire.
ELIBBAD
L'interprèteur ELF mentionné n'est pas dans un format connu.

Conformité

SVr4, SVID, X/OPEN, BSD 4.3. POSIX ne documente pas le comportement avec #! mais est néanmoins compatible. SVr4 décrit des erreurs supplémentaires EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX ne décrit pas les conditions d'erreur ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR, ni ELIBBAD.

Notes

Les processus Set-UID et Set-GID ne peuvent pas être suivis par ptrace() en positionnant effectivement leur UID ou leur GID.

La première ligne d'un shell script exécutable (#!) a une longueur maximale de 127 caractères.

Linux ignore les bits Set-UID et Set-GID sur les scripts.

Voir Aussi

chmod(2) , fork(2) , execl(3) , environ(5) , ld.so(8) .

Traduction

Christophe Blaess, 1997.


Table des matières


Haut de page

© 1996-2000 Adaptation française "Christophe Blaess"