/proc/pid/fd/ - Descripteurs de fichier
- /proc/pid/fd/
- Il s'agit d'un sous-répertoire contenant un enregistrement pour
chaque fichier ouvert par le processus. Chaque enregistrement a le
descripteur du fichier pour nom, et est un lien symbolique vers le vrai
fichier. Ainsi, 0 correspond à l'entrée
standard, 1 à la sortie standard, 2 à la
sortie d'erreur, etc.
- Pour les descripteurs de fichier de tubes et de sockets, les
enregistrements seront des liens symboliques dont le contenu est le type
de fichier avec l’inœud. Un appel de readlink(2) sur
ce fichier renvoie une chaîne au format :
-
type:[inœud]
- Par exemple, socket:[2248868] sera un socket et son inœud
est 2248868. Pour les sockets, cet inœud permet de trouver plus de
renseignements dans un des fichiers de /proc/net/.
- Pour les descripteurs de fichier sans inœud correspondant (par
exemple les descripteurs de fichier produits par bpf(2),
epoll_create(2), eventfd(2), inotify_init(2),
perf_event_open(2), signalfd(2), timerfd_create(2) et
userfaultfd(2)), l’enregistrement sera un lien symbolique
avec un contenu de la forme :
-
anon_inode:type_fichier
- Dans de nombreux cas (mais pas tous), le type_fichier est
entouré de crochets.
- Par exemple, un descripteur de fichier epoll aura un lien symbolique dont
le contenu est la chaîne anon_inode:[eventpoll].
- Dans un processus multithread, le contenu de ce répertoire n'est
pas disponible si le processus principal est déjà
terminé (typiquement par l'appel de pthread_exit(3)).
- Les programmes qui prennent un nom de fichier comme paramètre de la
ligne de commande, mais qui ne prennent pas leur entrée sur
l'entrée standard si aucun paramètre n'est fourni, ou qui
écrivent dans un fichier indiqué par un paramètre de
la ligne de commande sans envoyer la sortie sur la sortie standard si
aucun paramètre n'est fourni, peuvent néanmoins utiliser
l'entrée standard et la sortie standard par l'intermédiaire
des fichiers /proc/pid/fd comme arguments de ligne de
commande. Par exemple, en supposant que l'option -i indique le nom
du fichier d'entrée et l'option -o le nom du fichier de
sortie :
-
$ tototiti -i /proc/self/fd/0 -o /proc/self/fd/1 ...
- et vous avez alors réalisé un filtre fonctionnel.
- /proc/self/fd/N est approximativement identique à
/dev/fd/N sur certains systèmes UNIX ou de type UNIX. En
fait, la plupart des scripts MAKEDEV de Linux lient symboliquement
/dev/fd à /proc/self/fd.
- La plupart des systèmes fournissent les liens symboliques
/dev/stdin, /dev/stdout et /dev/stderr, qui sont
respectivement liés aux fichiers 0, 1 et 2 de
/proc/self/fd. Par conséquent, l'exemple
précédent peut être écrit de la façon
suivante :
-
$ tototiti -i /dev/stdin -o /dev/stdout ...
- La permission de déréférencer ou de lire
(readlink(2)) ces liens symboliques dans ce répertoire est
régie par une vérification du mode d’accès
ptrace PTRACE_MODE_READ_FSCREDS ; consulter
ptrace(2).
- Remarquez que pour les descripteurs de fichier
référençant des inœuds (tubes et sockets, voir
ci-dessus), ces inœuds ont toujours les bits de permission et les
informations d’appartenance distincts de ceux de
l’enregistrement /proc/pid/fd, et le
propriétaire peut être différent des ID utilisateur
et groupe du processus. Un processus non privilégié peut ne
pas avoir les permissions suffisantes pour les ouvrir, comme dans cet
exemple :
-
$ echo test | sudo -u nobody cat
test
$ echo test | sudo -u nobody cat /proc/self/fd/0
cat: /proc/self/fd/0: Permission denied
- Le descripteur de fichier 0 se réfère au tube
créé par l’interpréteur et ayant pour
propriétaire cet utilisateur d’interpréteur, qui est
nobody, aussi cat n’a pas la permission de
créer un nouveau descripteur de fichier pour lire cet inœud,
même s’il peut toujours lire à partir de son
descripteur de fichier 0 existant.
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>,
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr> et Lucien Gentis
<lucien.gentis@waika9.com>
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.