EXECVE
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
NOTES
VOIR AUSSI
TRADUCTION
NOM
execve - Exécuter un programme.
SYNOPSIS
#include <unistd.h>
int execve (const char *fichier, char * const argv
[], char * const envp[]);
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 " #! interpréteur [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.
Le signal SIGCHLD (lorsqu'il est configuré sur SIG_IGN) peut ou non être
réinitialisé à SIG_DFL.
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'exé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.
- EACCES
-
Le système de fichiers est monté avec l'option
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é.
- EPERM
-
Le processus est suivi avec ptrace(2), l'utilisateur n'est pas
le Super-User, et le fichier a un bit Set-UID ou Set-GID activé.
- E2BIG
-
La liste d'arguments est trop grande.
- ENOEXEC
-
Le fichier exé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
ou un script ou un interpréteur ELF n'existe pas, ou une bibliothèque partagée
nécessaire pour le fichier ou l'interpréteur n'est pas disponible.
- ENOMEM
-
Pas assez de mémoire pour le noyau.
- ENOTDIR
-
Un élément du chemin d'accès n'est pas un répertoire.
- EACCES
-
L'accès à un élément du chemin n'est pas autorisé.
- 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().
Linux ignore les bits Set-UID et Set-GID sur les scripts.
Le résultat d'un montage de système de fichiers avec l'attribut
nosuid
peut varier suivant les versions de noyau : certaines refuseront l'exécution
des fichiers SUID/SGID lorsque cela donnerait à l'appelant des privilèges
qu'il n'a pas (et renverront l'erreur EPERM), d'autres ignoreront simplement
les bits SUID/SGID mais accepteront d'effectuer l'appel execve.
La première ligne d'un shell script exécutable (#!) a une longueur
maximale de 127 caractères.
VOIR AUSSI
TRADUCTION
Christophe Blaess, 1996-2003.
|