O destino do link do pipe existe em algum lugar no sistema de arquivos?

5

Estou falando sobre isso:

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

pipe:[80076194] é um caminho para o destino ou apenas indicação de que o descritor de arquivo está conectado ao canal e não existe no sistema de arquivos? A principal razão pela qual estou perguntando é devido a php para alguém tentar desreferenciar:

$ 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
    
por x-yuri 16.04.2014 / 00:07

1 resposta

5

Em suma, não, não existe.

Em muito tempo:

Existem 2 tipos de tubos no linux, pipes nomeados (aka, fifo) e pipes regulares.

Os pipes nomeados são criados com a chamada de sistema mkfifo ( man 3 mkfifo ). Os pipes nomeados existem como arquivos no sistema de arquivos. Um processo abre para leitura e outro abre para escrever.

Canais regulares são criados com a chamada de sistema pipe ( man 2 pipe ). Uma vez abertos, eles se comportam exatamente da mesma forma que abrir um tubo mkfifo. Eles pegam um descritor de arquivo, uma extremidade está aberta para leitura, a outra está aberta para escrita.

Como eles usam um descritor de arquivo, eles aparecem em /proc/PID/fd/ . Mas como eles não existem como um arquivo real em lugar algum, a entrada em /proc/PID/fd/ precisa fazer um pouco de mágica. Então basicamente o pipe é representado como symlink com um alvo falso. Quando você abre o symlink, o kernel realmente abre o pipe que é representado pelo symlink. Mas como é um link simbólico e os links simbólicos têm destinos, qualquer coisa que tente cancelar a referência ao link simbólico recuperará um alvo. É só que esse alvo não aponta para um arquivo válido.

Normalmente, você não pode fazer isso com links simbólicos, no entanto, o sistema de arquivos /proc não é um sistema de arquivos normal. É um sistema de arquivos falso representado pelo kernel. E como o conteúdo é criado pelo kernel, o kernel pode quebrar suas próprias regras.

    
por 16.04.2014 / 02:44

Tags