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
stdoutcanal é redirecionado para o arquivo temporário criado nos pipefs - O arquivo no lado direito do operador do tubo está
stdindefinido 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 ' stdinou stdoutpara 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.