파이프의 링크 대상이 파일 시스템 어딘가에 존재합니까?

파이프의 링크 대상이 파일 시스템 어딘가에 존재합니까?

나는 이것에 대해 이야기하고 있습니다 :

$ 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라고도 함)와 익명 파이프라는 두 가지 유형의 파이프가 있습니다.

명명된 파이프는 mkfifo( ) 시스템 호출을 통해 man 3 mkfifo생성 됩니다. 명명된 파이프는 파일 시스템에 파일로 존재합니다. 한 프로세스에서는 이를 읽기 위해 열고 다른 프로세스에서는 쓰기 위해 엽니다.

익명 파이프는 pipe( ) 시스템 호출을 통해 man 2 pipe생성 됩니다. 일단 열리면 mkfifo 파이프를 여는 것과 똑같이 작동합니다. 한쪽 끝은 읽기용으로 열려 있고 다른 쪽 끝은 쓰기용으로 열려 있는 파일 설명자를 차지합니다.

파일 설명자를 차지 하기 때문에 /proc/PID/fd/. /proc/PID/fd/따라서 기본적으로 파이프는 가짜 대상이 있는 심볼릭 링크로 표시됩니다. 심볼릭 링크를 열면 커널은 실제로 심볼릭 링크가 나타내는 파이프를 엽니다. 그러나 이는 심볼릭 링크이고 심볼릭 링크에는 대상이 있으므로 심볼릭 링크를 역참조하려는 시도(커널을 통해 암시적으로 수행하는 것이 아님)는 대상을 반환합니다. 단지 이 대상이 유효한 파일을 가리키지 않는다는 것뿐입니다.

일반적으로 심볼릭 링크를 사용하여 이 작업을 수행할 수 없지만 이 /proc파일 시스템은 일반 파일 시스템이 아닙니다. 이는 커널로 대표되는 가짜 파일 시스템이다. 콘텐츠는 커널에 의해 생성되므로 커널은 자체 규칙을 위반할 수 있습니다.

관련 정보