パイプのリンク先はファイルシステムのどこかに存在しますか?

パイプのリンク先はファイルシステムのどこかに存在しますか?

私はこれについて話しています:

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

ターゲットへのパスですかpipe:[80076194]、それともファイル記述子がパイプに接続されており、ファイルシステムに存在しないことを示します。私が尋ねる主な理由は、php誰かがそれを逆参照しようとするからです。

$ 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

ベストアンサー1

簡単に言えば、いいえ、存在しません。

 

長い:

Linuxには、名前付きパイプ(FIFOとも呼ばれます)と匿名パイプという2種類のパイプがあります。

名前付きパイプはmkfifo()システムコールを介してman 3 mkfifo生成されます。名前付きパイプはファイルシステムにファイルとして存在します。あるプロセスではこれを読み取り用に開き、もう一方のプロセスでは書き込み用に開きます。

匿名パイプはpipe()システムコールを介してman 2 pipe生成されます。一度開くと、mkfifoパイプを開くのと同じように動作します。一方の端は読み取り用に開いており、もう一方の端は書き込み用に開いているファイル記述子を占めています。

ファイル記述子を占めるので/proc/PID/fd//proc/PID/fd/したがって、デフォルトでは、パイプは偽のターゲットを持つシンボリックリンクとして表示されます。シンボリックリンクを開くと、カーネルは実際にシンボリックリンクが表すパイプを開きます。ただし、これはシンボリックリンクであり、シンボリックリンクにはターゲットがあるため、シンボリックリンクを逆参照しようとすると(カーネルを介して暗黙的に実行するのではなく)、ターゲットが返されます。これは、このターゲットが有効なファイルを指していないということです。

通常、シンボリックリンクを使用してこれを行うことはできませんが、この/procファイルシステムは通常のファイルシステムではありません。これはカーネルに代表される偽のファイルシステムです。コンテンツはカーネルによって生成されるため、カーネルは独自のルールに違反する可能性があります。

おすすめ記事