La cible de binding de pipe existe-t-elle quelque part dans le système de files?

Je parle de ceci:

$ readlink <(echo test) pipe:[80076194] 

Est-ce que pipe:[80076194] un path vers la cible ou juste une indication que le descripteur de file est connecté au tube et n'existe pas dans le système de files? La raison principale que je request est due à php pour celui qui tente de le déreferencer:

 $ strace -f php -r 'var_dump(file_get_contents($_SERVER["argv"][1]));' -- <(echo test) ... [pid 654] lstat("/dev/fd/63", {st_mode=S_IFLNK|0500, st_size=64, ...}) = 0 [pid 654] readlink("/dev/fd/63", "pipe:[80095114]", 4096) = 15 [pid 654] lstat("/dev/fd/pipe:[80095114]", 0x7fff9c3628a0) = -1 ENOENT (No such file or directory) [pid 654] lstat("/dev/fd", {st_mode=S_IFLNK|0777, st_size=13, ...}) = 0 [pid 654] readlink("/dev/fd", "/proc/self/fd"..., 4096) = 13 [pid 654] lstat("/proc/self/fd", {st_mode=S_IFDIR|0500, st_size=0, ...}) = 0 [pid 654] lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=64, ...}) = 0 [pid 654] readlink("/proc/self", "654"..., 4096) = 3 [pid 654] lstat("/proc/654", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 [pid 654] lstat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 [pid 654] open("/proc/654/fd/pipe:[80095114]", O_RDONLY) = -1 ENOENT (No such file or directory) [pid 654] write(2, "PHP Warning: file_get_contents("..., 125PHP Warning: file_get_contents(/dev/fd/63): failed to open stream: No such file or directory in Command line code on line 1 ) = 125 [pid 654] write(1, "bool(false)\n", 12bool(false) ) = 12 

En bref, non, il n'existe pas.

En long:

Il y a 2 types de pipes sous linux, nommés pipes (aka, fifo), et des pipes régulières.

Les canaux nommés sont créés avec l'appel système mkfifo ( man 3 mkfifo ). Les canaux nommés existent en tant que files sur le système de files. Un process l'ouvre pour la lecture et un autre l'ouvre pour l'écriture.

Les tuyaux ordinaires sont créés avec l'appel système pipe ( man 2 pipe ). Une fois ouverts, ils se comportent exactement comme l'ouverture d'un tuyau mkfifo. Ils prennent un descripteur de file, une extrémité est ouverte pour la lecture, l'autre est ouverte pour l'écriture.

Parce qu'ils prennent un descripteur de file, ils apparaissent dans /proc/PID/fd/ . Mais puisqu'ils n'existent pas en tant que file réel, l'input dans /proc/PID/fd/ doit faire un peu de magie. Donc, fondamentalement, le tuyau est représenté comme un lien symbolique avec une fausse cible. Lorsque vous ouvrez le lien symbolique, le kernel ouvre réellement le tuyau représenté par le lien symbolique. Mais puisque c'est un lien symbolique, et que les liens symboliques ont des cibles, tout ce qui essaie de déreferencer le lien symbolique récupérera une cible. C'est juste que cette cible ne pointe pas vers un file valide.

Normalement, vous ne pouvez pas faire cela avec des liens symboliques, mais le système de files /proc n'est pas un système de files normal. C'est un faux système de files représenté par le kernel. Et puisque le contenu est créé par le kernel, le kernel peut briser ses propres règles.