/ proc / self est un sucre syntaxique. C'est un raccourci pour contatenating / proc / et le résultat du syscall getpid () (accessible par le biais de la métavariable $$). Cela peut prêter à confusion, cependant, dans le cas de scripts shell, de nombreuses instructions invoquant d'autres processus, complétées par les propres PID ... Les PID qui font référence, le plus souvent, à des processus inactifs. Considérer:
root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan 1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593
'/ bin / ls' évaluera le chemin du répertoire et le résoudra en tant que / proc / 26563, car il s'agit du PID du processus - le processus / bin / ls nouvellement créé - qui lit le contenu du répertoire. Toutefois, au moment du processus suivant dans le pipeline, dans le cas d'un script shell, ou au retour de l'invite, dans le cas d'un shell interactif, le chemin n'existe plus et la sortie d'informations fait référence à un processus inexistant.
Ceci ne s'applique toutefois qu'aux commandes externes (celles-ci sont de véritables fichiers de programme exécutables, par opposition à celles intégrées au shell). Ainsi, vous obtiendrez des résultats différents si, par exemple, vous utilisez une suppression de nom de fichier pour obtenir une liste du contenu du répertoire, plutôt que de transmettre le nom du chemin au processus externe / bin / ls:
root@vps01:~# ls /proc/self/fd
0 1 2 3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3
Dans la première ligne, le shell a généré un nouveau processus, '/ bin / ls', via l'appel système exec (), en passant "/ proc / self / fd" comme argv [1]. '/ bin / ls' a à son tour ouvert le répertoire / proc / self / fd et lu, puis imprimé, son contenu au fur et à mesure de son itération.
La deuxième ligne, cependant, utilise glob () dans les coulisses pour développer la liste des noms de fichiers; ceux-ci sont passés sous forme de tableau de chaînes à écho. (Habituellement implémenté en tant que commande interne, mais il y a souvent aussi un binaire / bin / echo ... mais cette partie est en réalité sans importance, puisque echo ne traite que des chaînes, il ne renvoie jamais à aucun appel système lié à des noms de chemins.)
Maintenant, considérons le cas suivant:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Ici, le shell, le processus parent de / bin / ls, a fait un sous-répertoire de / proc / self son répertoire actuel . Ainsi, les noms de chemin relatifs sont évalués de son point de vue. Ma meilleure hypothèse est que cela est lié à la sémantique de fichier POSIX dans laquelle vous pouvez créer plusieurs liens physiques vers un fichier, y compris tous les descripteurs de fichier ouverts. Donc, cette fois, / bin / ls se comporte de la même manière que echo / proc / $$ / fd / *.
/proc/self
, bien sûr.