web-dev-qa-db-ja.com

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

私はこれについて話している:

$ 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
5
x-yuri

要するに、それは存在しません。

長い間:

Linuxには、名前付きパイプ(別名、fifo)と通常のパイプの2種類のパイプがあります。

名前付きパイプは、mkfifoman 3 mkfifo)システムコールで作成されます。名前付きパイプは、ファイルシステム上のファイルとして存在します。 1つのプロセスは読み取り用に開き、別のプロセスは書き込み用に開きます。

通常のパイプは、pipeman 2 pipe)システムコールで作成されます。一度開くと、mkfifoパイプを開くのとまったく同じように動作します。それらはファイル記述子を取り、一方の端は読み取り用に開いており、もう一方の端は書き込み用に開いています。

それらはファイル記述子を使用するため、/proc/PID/fd/に表示されます。ただし、実際のファイルとしてはどこにも存在しないため、/proc/PID/fd/のエントリは少し魔法をかける必要があります。したがって、基本的にパイプは偽のターゲットとのシンボリックリンクとして表されます。シンボリックリンクを開くと、カーネルは実際にシンボリックリンクで表されるパイプを開きます。ただし、これはシンボリックリンクであり、シンボリックリンクにはターゲットがあるため、シンボリックリンクを逆参照しようとすると、ターゲットが返されます。このターゲットが有効なファイルを指していないだけです。

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

5
Patrick