execveat
Section: System Calls (2)
Updated: 2 janvier 2023
Index
Return to Main Contents
NOM
execveat - Exécuter un programme relatif au descripteur de fichier d'un
répertoire
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <linux/fcntl.h> /* Définition des constantes AT_* */
#include <unistd.h>
int execveat(int dirfd, const char *pathname,
char *const _Nullable argv[],
char *const _Nullable envp[],
int flags);
DESCRIPTION
L'appel système execveat() exécute le programme auquel renvoient dirfd
et pathname. Il opère exactement de la même manière que execve(2),
excepté les différences décrites dans cette page de manuel.
Si le nom de chemin fourni dans pathname est relatif, il est interprété
relativement au répertoire référencé par le descripteur de fichier dirfd
(plutôt que relativement au répertoire de travail courant du processus
appelant, comme cela est fait par execve(2) pour un chemin relatif).
Si pathname est relatif et que dirfd est la valeur spéciale
AT_FDCWD, pathname est interprété relativement au répertoire de
travail courant du processus appelant (comme avec execve(2)).
Si pathname est absolu, alors dirfd est ignoré.
Si pathname est une chaîne vide et si le drapeau AT_EMPTY_PATH est
indiqué, le descripteur de fichier dirfd spécifie le fichier à exécuter
(c-est-à-dire que dirfd renvoie à un fichier exécutable et non à un
répertoire).
L'argument flags est un masque de bit qui peut comprendre zéro ou
plusieurs des drapeaux suivants :
- AT_EMPTY_PATH
-
Si pathname est une chaîne vide, opérer sur le fichier auquel renvoie
dirfd (qu'on peut obtenir en utilisant le drapeau O_PATH de
open(2)).
- AT_SYMLINK_NOFOLLOW
-
Si le fichier identifié par dirfd est un pathname non NULL est un lien
symbolique, l'appel échoue avec l'erreur ELOOP.
VALEUR RENVOYÉE
En cas de réussite, execveat() ne renvoie rien. En cas d'échec il renvoie
-1 et errno est positionné pour indiquer l'erreur.
ERREURS
Les mêmes erreurs qui apparaissent pour execve(2) peuvent apparaître pour
execveat(2). Les erreurs supplémentaires suivantes peuvent également se
produire pour execveat(2) :
- pathname
-
est relatif mais dirfd n'est ni AT_FDCWD, ni un descripteur de fichier
valable.
- EINVAL
-
flags contient un attribut non valable.
- ELOOP
-
flags comprend AT_SYMLINK_NOFOLLOW et le fichier identifié par
dirfd et un pathname non NULL est un lien symbolique.
- ENOENT
-
Le programme identifié par dirfd et pathname exige d'utiliser un
interpréteur (tel qu'un script qui commence par « #! », mais le descripteur
de fichier dirfd a été ouvert avec le drapeau O_CLOEXEC, d'où il s'en
suit que le fichier du programme est inaccessible à l'interpréteur
lancé. Voir BOGUES.
- ENOTDIR
-
pathname est relatif et dirfd est un descripteur de fichier faisant
référence à un fichier qui n'est pas un dossier.
VERSIONS
execveat() a été ajouté dans Linux 3.19. La prise en charge de la
bibliothèque a été ajoutée dans la glibc 2.34.
STANDARDS
L'appel système execveat() est spécifique à Linux.
NOTES
Outre les raisons expliquées dans openat(2), l'appel système
execveat() est également nécessaire pour permettre à fexecve(3) d'être
implémenté sur des systèmes où aucun système de fichiers /proc n'est
monté.
Si on lui demande d'exécuter un fichier script, argv[0] qui est passé à
l'interpréteur de script est une chaîne sous la forme /dev/fd/N ou
/dev/fd/N/P, où N est le numéro du descripteur de fichier passé via
l'argument dirfd. Une chaîne sous la première forme apparaît quand
AT_EMPTY_PATH est utilisé. Une chaîne sous la deuxième forme apparaît
quand le script est indiqué via dirfd et pathname ; dans ce cas, P
est la valeur donnée à pathname.
Pour les mêmes raisons décrites dans fexecve(3), l'usage naturel quand on
utilise execveat() est de positionner l'attribut close-on-exec sur
dirfd (mais voir BOGUES).
BOGUES
L'erreur ENOENT décrite ci-dessus signifie qu'il n'est pas possible de
positionner l'attribut close-on-exec sur le descripteur de fichier donné à
l'appel sous la forme :
execveat(fd, "", argv, envp, AT_EMPTY_PATH);
Cependant, l'impossibilité de positionner l'attribut close-on-exec signifie
qu'un descripteur de fichier renvoyant à un script a une fuite via le script
lui-même. Outre qu'elle gaspille le descripteur de fichier, cette fuite peut
l'épuiser dans des scénari où les scripts utilisent execveat() de manière
récursive.
VOIR AUSSI
execve(2), openat(2), fexecve(3)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 06:46:04 GMT, May 18, 2024