table of contents
other languages
other sections
EXECVE(2) | Manuel du programmeur Linux | EXECVE(2) |
NOM¶
execve - Exécuter un programmeSYNOPSIS¶
#include <unistd.h>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 [argument-optionnel]
int main(int argc, char *argv[], char *envp[])
- *
- Les signaux pour lesquels le processus avait placé un gestionnaire sont réinitialisés à leur valeur par défaut (consultez signal(7)).
- *
- L'éventuelle pile spécifique pour les gestionnaires 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(2)).
- *
- 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)).
- *
- L'environnement de travail en virgule flottante est remis à zéro (consultez fenv(3)).
- *
- 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é.
- *
- (Depuis Linux 2.4.36 ou 2.6.23) Si un programme setuid ou setgid est exécuté, alors le signal de mort de son père défini par l'attribut PR_SET_PDEATHSIG 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.
- *
- L'attribut securebits SECBIT_KEEP_CAPS de prctl() est effacé. Consultez capabilities(7).
- *
- Le signal de terminaison est réinitialisé à SIGCHLD (consultez clone(2)).
- *
- 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(), consultez capabilities(7).
- *
- Par défaut, les descripteurs de fichier restent ouverts au travers d'un execve(). Les descripteurs marqués close‐on‐exec sont fermés ; consultez la description de FD_CLOEXEC dans fcntl(2). (Si un descripteur de fichier est fermé, cela cause la libération de tous les verrous d'enregistrement obtenus sur le fichier correspondant par ce processus. Consultez fcntl(2) pour les détails.) POSIX.1-2001 indique que si les descripteurs de fichiers 0, 1 et 2 devaient être fermés après un execve() réussi, et le processus devient privilégié en raison d'un bit set-user-ID ou set-group-ID sur le fichier exécuté, le système peut ouvrir un fichier non spécifié pour chacun de ces descripteurs. En général, un programme portable, privilégié ou pas, peut considérer que ces trois descripteurs resteront fermés après un execve().
Scripts¶
Un script est un fichier dont le bit d'exécution est activé et dont la première ligne est de la forme :#! interpréteur [argument-optionnel]
interpréteur [argument-optionnel] filename arg...
Limites sur la taille des paramètres et environnement¶
La plupart des implémentations UNIX imposent des limites sur la taille totale des chaînes des paramètres des lignes de commande ( argv) et de l'environnement ( envp) qui peuvent être passées à un nouveau programme. POSIX.1 permet à une implémentation d'annoncer cette limite en utilisant la constante ARG_MAX (soit définie dans <limits.h>, soit disponible à l'exécution en utilisant l'appel sysconf(_SC_ARG_MAX)).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. (Consultez aussi path_resolution(7).)
- 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 filename, 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(2).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.EXEMPLE¶
Le programme suivant est conçu pour être exécuté par le second programme ci‐dessous. Il se contente d'afficher sa ligne de commande, un argument par ligne./* myecho.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int j; for (j = 0; j < argc; j++) printf("argv[%d]: %s\n", j, argv[j]); exit(EXIT_SUCCESS); }
/* execve.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *newargv[] = { NULL, "hello", "world", NULL }; char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() ne retourne qu'en cas d'erreur */ exit(EXIT_FAILURE); }
$ cc myecho.c -o myecho $ cc execve.c -o execve $ ./execve ./myecho argv[0]: ./myecho argv[1]: hello argv[2]: world
$ cat > script.sh #! ./myecho script-arg ^D $ chmod +x script.sh
$ ./execve ./script.sh argv[0]: ./myecho argv[1]: script-arg argv[2]: ./script.sh argv[3]: hello argv[4]: world
VOIR AUSSI¶
chmod(2), fork(2), ptrace(2), execl(3), fexecve(3), getopt(3), credentials(7), environ(7), path_resolution(7), ld.so(8)COLOPHON¶
Cette page fait partie de la publication 3.44 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse <http://www.kernel.org/doc/man-pages/>.TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>. Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009). 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> ».27 octobre 2012 | Linux |