execl, execlp, execle, execv, execvp, execvpe - Exécuter un fichier
Bibliothèque C standard (
libc,
-lc)
#include <unistd.h>
extern char **environ;
int execl(const char *chemin, const char *arg, ...
/*, (char *) NULL */);
int execlp(const char *fichier, const char *arg, ...
/*, (char *) NULL */);
int execle(const char *chemin, const char *arg, ...
/*, (char *) NULL, char *const envp[] */);
int execv(const char *chemin, char *const argv[]);
int execvp(const char *fichier, char *const argv[]);
int execvpe(const char *fichier, char *const argv[], char *const envp[]);
execvpe():
_GNU_SOURCE
La famille des fonctions
exec() remplace l'image du processus en cours
par l'image d'un nouveau processus. Les fonctions décrites dans cette
page de manuel sont en réalité des frontaux pour
execve(2) (consultez la page de manuel de
execve(2) pour plus de
détails sur le remplacement de l'image du processus en cours).
Le premier argument de toutes ces fonctions est le nom du fichier à
exécuter.
Les fonctions peuvent être regroupées en se basant sur les lettres
qui suivent le préfixe "exec".
Les arguments
const char *arg et les points de suspension qui
suivent peuvent être vus comme
arg0,
arg1, ...,
argn. Ensemble, ils décrivent une liste d'un ou plusieurs
pointeurs sur des chaînes de caractères terminées par des
caractères de code 0 qui représentent la liste des arguments
disponibles pour le programme à exécuter. Par convention, le
premier argument doit pointer sur le nom du fichier associé au
programme à exécuter. La liste des arguments
doit se
terminer par un pointeur NULL, et puisque ce sont des fonctions variadiques,
ce pointeur doit être transtypé avec
(char *)
NULL.
A la différence des fonctions 'l', les fonctions 'v' (voir ci-dessous)
spécifient les arguments de ligne de commande du programme à
exécuter sous la forme d'un tableau de pointeurs.
L'argument
char *const argv[] est un tableau de pointeurs sur des
chaînes de caractères terminées par un caractère
de code 0 et représente la liste des arguments disponibles pour le
nouveau programme . Par convention, le premier argument doit pointer sur le
nom du fichier associé au programme à exécuter. Le
tableau de pointeurs
doit se terminer par un pointeur NULL.
L'environnement de l'image du nouveau processus est spécifié
à l'aide de l'argument
envp. Ce dernier est un tableau de
pointeurs sur des chaînes de caractères terminées par des
caractères de code 0 et
doit se terminer par un pointeur NULL.
Toutes les autres fonctions
exec() (qui ne possèdent pas le
suffixe 'e') extraient l'environnement pour l'image du nouveau processus
depuis la variable externe
environ dans le processus appelant.
Ces fonctions dupliqueront les actions de l'interpréteur de commandes
dans la recherche du fichier exécutable si le nom fourni ne contient
pas de barre oblique « / ». Le fichier est
recherché dans la liste de répertoires séparés par
des deux-points indiquée dans la variable d'environnement
PATH.
Si cette variable n'est pas définie, la liste de chemins par
défaut correspondra à une liste contenant les répertoires
renvoyés par
confstr(_CS_PATH) (qui renvoie en
général la valeur "/bin:/usr/bin"), et
éventuellement le répertoire courant ; voir NOTES pour
plus de détails.
execvpe() recherche le programme en utilisant la valeur de
PATH de
l'environnement de l'appelant, et non celle issue de l'argument
envp.
Si le nom du fichier spécifié inclut une barre oblique, alors
PATH est ignoré et le fichier dont le chemin est fourni est
exécuté.
De plus, certaines erreurs sont traitées de manière
spécifique.
Si l'accès au fichier est refusé (
execve(2) renvoie alors
une erreur
EACCES), ces fonctions continueront à parcourir le
reste du chemin de recherche. Si aucun fichier n'est trouvé, elles se
termineront en renvoyant
errno défini à
EACCES.
Si l'en-tête d'un fichier n'est pas reconnu (
execve(2) renvoie
alors une erreur
ENOEXEC), ces fonctions exécuteront
l'interpréteur de commandes (
/bin/sh) avec le chemin
d'accès au fichier en tant que premier argument. Si cette tentative
échoue, aucune recherche supplémentaire ne sera
effectuée.
Toutes les autres fonctions
exec() (qui ne comportent pas le suffixe 'p')
ont pour premier argument un chemin (relatif ou absolu) qui spécifie le
programme à exécuter.
Les fonctions
exec() ne s'interrompent que si une erreur s'est produite.
La valeur renvoyée est
-1, et
errno contient le code
d'erreur.
Toutes ces fonctions peuvent échouer et définir
errno
à n'importe quelle erreur décrite dans
execve(2).
La fonction
execvpe() a été introduite dans la
glibc 2.11.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
execl(), execle(), execv() |
Sécurité des threads |
MT-Safe |
execlp(), execvp(), execvpe() |
Sécurité des threads |
MT-Safe env |
POSIX.1-2001, POSIX.1-2008.
La fonction
execvpe() est une extension GNU.
Le chemin de recherche par défaut (utilisé lorsque l'environnement
ne contient pas la variable
PATH) varie en fonction du système
utilisé. Il contient en général
/bin et
/usr/bin (dans cet ordre) et parfois aussi le répertoire
courant. Sur certains systèmes et à titre de mesure anti-cheval
de Troie, le répertoire courant est inclus après
/bin et
/usr/bin. L'implémentation de la glibc quant à elle, a
longtemps conservé le chemin de recherche par défaut
traditionnel où le répertoire courant se situe en tête de
liste. Cependant, suite à une réécriture du code lors du
développement de la version 2.24 de la glibc, le répertoire
courant a été proprement éjecté du chemin de
recherche. Ce changement de comportement accidentel étant
considéré cependant comme relativement bénéfique,
il n'y aura pas de retour en arrière.
Le comportement de
execlp() et
execvp() lorsqu'une erreur se
produit pendant l'exécution d'un programme est un comportement
historique mais n'a traditionnellement jamais été
documenté, ni spécifié dans la norme POSIX. Lorsque
ETXTBSY est rencontré, BSD (et peut-être d'autres
systèmes) endorment le processus appelant puis réitère
l'opération. Sous Linux, cette situation est considérée
comme une erreur grave, et la commande se termine immédiatement.
Traditionnellement, les fonctions
execlp() et
execvp() ignoraient
toutes les erreurs sauf celles décrites ci-dessus,
ENOMEM et
E2BIG à la survenue desquelles elles se terminaient.
Désormais, elles se terminent si une autre erreur que celles-ci se
produit.
Dans les versions de la glibc antérieures à 2.24,
execl()
et
execle() utilisaient
realloc(3) en interne et
n'étaient donc pas async-signal-safe, en violation des
spécifications de POSIX.1. La version 2.24 de la glibc corrige ce
problème.
Sous sparc et sparc64,
execv() est fournie en tant qu'appel
système par le noyau (avec le prototype décrit ci-dessus)
à titre de compatibilité avec SunOS. Sous ces architectures, la
fonction qui sert de frontal à
execv()
n'utilise pas
cette fonction.
sh(1),
execve(2),
execveat(2),
fork(2),
ptrace(2),
fexecve(3),
system(3),
environ(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Lucien Gentis <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]