Rechercher une page de manuel
execve
Langue: fr
Version: 4 septembre 2006 (ubuntu - 01/11/07)
Section: 2 (Appels système)
NOM
execve - Exécuter un programmeSYNOPSIS
#include <unistd.h>int execve(const char *filename, char * const argv [],
char *const envp[]);
DESCRIPTION
execve() exécute le programme correspondant au fichier filename. 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] filename.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 clé=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 (« data » et « bss »), ainsi que la pile du processus appelant sont remplacés par ceux du programme chargé.
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 filename, et si le programme n'est pas tracé, 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.
L'UID effectif du processus est copié dans le Set-UID sauvé ; de la même manière, le GID effectif est copié dans le Set-GID sauvé. Ces copies ont lieu après toute modification d'ID effectif à cause des bits de permission Set-UID et Set-GID.
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(8) 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.
Tous les attributs du processus sont préservés lors d'un execve(), à l'exception des suivants :
- *
- Les descripteurs de fichiers ayant l'attribut close-on-exec sont fermés (voir la description de FD_CLOEXEC dans fcntl(2)).
- *
- L'ensemble des signaux en attente est vidé (sigpending(2)).
- *
- Les signaux pour lesquels le processus avait placé un gestionnaire sont maintenant ignorés.
- *
- L'éventuelle pile spécifique pour les gestionnaire de signaux n'est pas conservée (sigaltstack(2)).
- *
- Les projections en mémoire ne sont pas conservées (mmap(2)).
- *
- Les segments de mémoire partagée System V sont détachés (shmat(2)).
- *
- Les objets de mémoire partagée POSIX sont supprimés (shm_open(3)).
- *
- Les descripteurs de files de messages POSIX ouverts sont fermés (mq_overview(7)).
- *
- Les sémaphores nommés POSIX ouverts sont fermés (sem_overview(7)).
- *
- Les temporisations POSIX ne sont pas conservées (timer_create(3)).
- *
- Les flux de répertoires ouverts sont fermés (opendir(3)).
- *
- Les verrouillages de mémoire ne sont pas préservés (mlock(2), mlockall(2)).
- *
- Les gestionnaires de terminaison ne sont pas préservés (atexit(3), on_exit(3)).
Les attributs de processus listés ci-dessus sont spécifiés dans POSIX.1-2001. Les attributs de processus spécifiques à Linux suivants sont également réinitialisés lors d'un execve() :
- *
- L'attribut PR_SET_DUMPABLE de prctl(2) est activé, sauf si un programme setuid ou setgid est exécuté, auquel cas il est désactivé.
- *
- L'attribut PR_SET_KEEPCAPS de prctl(2) est effacé.
- *
- Le nom du processus, positionné par prctl(2) PR_SET_NAME (et affiché avec ps -o comm), est réinitialisé avec le nom du nouvel exécutable.
- *
- Le signal de terminaison est réinitialisé à SIGCHLD (voir clone(2)).
Notez également les points suivants :
- *
- Tous les threads autre que l'appelant sont détruits lors d'un execve(). Les mutex, les variables de condition, et les autres objets de pthreads sont détruits.
- *
- L'équivalent de setlocale(LC_ALL, "C") est exécuté au démarrage du programme.
- *
- POSIX.1-2001 indique que les actions pour les signaux ignorés ou placés à la valeur par défaut ne sont pas modifiées. Une exception est néanmoins spécifiée dans POSIX.1-2001 : si SIGCHLD est ignoré, l'implémentation peut laisser l'action inchangée ou la replacer à la valeur par défaut ; Linux ne modifie pas l'action.
- *
- Toutes les opérations d'E/S asynchrones en cours sont annulées (aio_read(3), aio_write(3)).
- *
- Pour le traitement des capacités lors d'un execve(2), voir capabilities(7).
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
- E2BIG
- Le nombre total d'octets dans l'environnement (envp) et la liste d'arguments (argv) est trop grand.
- EACCES
- La permission de parcours est refusée pour un des composants du chemin filename ou du nom d'un interpréteur de script. (Voir aussi path_resolution(2).)
- EACCES
- Le fichier ou l'interpréteur de script n'est pas un fichier régulier.
- EACCES
- L'autorisation d'exécution est refusée pour le fichier, ou un interpréteur de script, ou un interpréteur ELF.
- EACCES
- Le système de fichiers est monté avec l'option noexec.
- EFAULT
- L'argument filename pointe en dehors de l'espace d'adressage accessible.
- EINVAL
- Un exécutable ELF a plusieurs segments PT_INTERP (indique plusieurs interpréteurs).
- EIO
- Une erreur d'entrée-sortie s'est produite.
- EISDIR
- L'interpréteur ELF cité est un répertoire.
- ELIBBAD
- L'interpréteur ELF mentionné n'est pas dans un format connu.
- ELOOP
- Le chemin d'accès au fichier, ou à un interpréteur de script, ou à un interpréteur ELF, contient une référence circulaire (à travers un lien symbolique)
- EMFILE
- Le nombre maximal de fichiers ouverts par processus est atteint.
- ENAMETOOLONG
- La chaîne de caractères filename est trop longue.
- ENFILE
- La limite du nombre total de fichiers ouverts sur le système a été atteinte.
- ENOENT
- Le fichier filename 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.
- ENOEXEC
- Le fichier exécutable n'est pas dans le bon format, ou est destiné à une autre architecture.
- ENOMEM
- Pas assez de mémoire pour le noyau.
- ENOTDIR
- Un élément du chemin d'accès au fichier filename, à un script ou à un interpréteur ELF, n'est pas un répertoire.
- 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 superutilisateur, et le fichier a un bit Set-UID ou Set-GID positionné.
- ETXTBSY
- Un exécutable a été ouvert en écriture par un ou plusieurs processus.
CONFORMITÉ
SVr4, BSD 4.3, POSIX.1-2001. POSIX.1-2001 ne documente pas le comportement avec « #! » mais est néanmoins compatible.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 du noyau Linux : certaines refuseront l'exécution des fichiers Set-UID et Set-GID lorsque cela donnerait à l'appelant des privilèges qu'il n'a pas (et renverront l'erreur EPERM), d'autres ignoreront simplement les bits Set-UID et Set-GID mais accepteront d'effectuer l'appel exec().
La première ligne d'un shell script exécutable (#!) a une longueur maximale de 127 caractères.
HISTORIQUE
Avec Unix V6, la liste des arguments d'un appel exec() se terminait par 0, alors que la liste des arguments de main se terminait par -1. Aussi, cette liste d'arguments n'était pas utilisable directement dans un appel exec() supplémentaire. Depuis Unix V7, les deux terminateurs sont NULL.VOIR AUSSI
chmod(2), fork(2), path_resolution(2), ptrace(2), execl(3), fexecve(3), environ(7), ld.so(8).TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par Alain Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006, et mise à disposition sur http://manpagesfr.free.fr/.Les mises à jour et corrections de la version présente dans Debian sont directement gérées par Julien Cristau <jcristau@debian.org> et l'équipe francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C <section> <page_de_man> ».
au milieu de marrons mufles : ô mec mouché !
Ô bilieux de barons, buffles aux becs bouchés :
malaise mien, nausée dessinée aux morts reines.
Ta bise est adulée par la torride laide.
Chers amis encornés, sales mines mâchées ;
chers habits encordés, sales bides bâchés !
Ta mise est annulée par ta taurine laine.
Tu comptes tes moutons, quel honneur amusé !
Tu comptes tes boutons, quelle odeur abusée !
Sans gerber, la boisson est fade et abolie.
Tu décodes ces bouts de doux enduits cordiaux :
sans germer, la moisson est fanée, amollie...
Tu déconnes ; c'est mou ! Ne nous ennuie, corniaud !
Chilles Ezbozido-Varèsse
-- Esposito-Farese, Gilles
Contenus ©2006-2008 Benjamin Poulain
Design ©2006-2008 Maxime Vantorre