EXECVE(2) Manuel du programmeur Linux EXECVE(2)
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.
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 parent
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 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 bib
liothè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'exécution du fichier n'est pas autorisée.
Linux 2.0.30 10 Décembre 1997 1
EXECVE(2) Manuel du programmeur Linux EXECVE(2)
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éper
toire.
ELOOP Le chemin d'accès au fichier contient une référence
circulaire (à travers un lien symbolique)
ETXTBUSY
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 pro
duite.
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 for
mat connu.
CONFORMITÉ
SVr4, SVID, X/OPEN, BSD 4.3. POSIX ne documente pas le
Linux 2.0.30 10 Décembre 1997 2
EXECVE(2) Manuel du programmeur Linux EXECVE(2)
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
ld.so(8), execl(3), fork(2)
TRADUCTION
Christophe Blaess, 1997.
Linux 2.0.30 10 Décembre 1997 3