execveat(2) | System Calls Manual | execveat(2) |
execveat - Exécuter un programme relatif au descripteur de fichier d'un répertoire
Bibliothèque C standard (libc, -lc)
#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);
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 :
En cas de réussite, execveat() ne renvoie rien. En cas d'échec il renvoie -1 et errno est positionné pour indiquer l'erreur.
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) :
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.
L'appel système execveat() est spécifique à Linux.
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).
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.
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 à debian-l10n-french@lists.debian.org.
2 janvier 2023 | Pages du manuel de Linux 6.03 |