Eu tenho lido sobre como os pipes são implementados no kernel do Linux e queria validar meu entendimento. Se estiver incorreto, a resposta com a explicação correta será selecionada.
- O Linux possui um VFS chamado pipefs montado no kernel (não no espaço do usuário)
- O pipefs possui um único super bloco e é montado em sua própria raiz (
pipe:
), ao lado de/
- pipefs não podem ser visualizados diretamente ao contrário da maioria dos sistemas de arquivos
- A entrada para pipefs é via
pipe(2)
syscall - O
pipe(2)
syscall usado pelos shells para canalizar com o|
operador (ou manualmente de qualquer outro processo) cria um novo arquivo nos pipefs que se comporta praticamente como um arquivo normal - O arquivo no lado esquerdo do operador de
stdout
canal é redirecionado para o arquivo temporário criado nos pipefs - O arquivo no lado direito do operador do tubo está
stdin
definido como o arquivo em pipefs - pipefs é armazenado na memória e, através de alguma mágica do kernel, não deve ser paginado
Esta é a explicação de como os tubos (por exemplo ls -la | less
) funcionam praticamente corretos?
Uma coisa que não entendo é como algo como o bash definiria um processo ' stdin
ou stdout
para o descritor de arquivo retornado por pipe(2)
. Ainda não consegui encontrar nada sobre isso.
Sim, estou me referindo especificamente às operações de nível inferior, com a suposição de que o
—
Brandon Wamboldt
|
operador está apenas chamando pipe(2)
como um processo como o bash.
pipe()
chamada do kernel, juntamente com o mecanismo que a suporta (pipefs
, etc), é um nível muito mais baixo do que o|
operador oferecido no seu shell. O último é geralmente implementado usando o primeiro, mas não precisa ser.