Como os pipes funcionam no Linux

21

Eu tenho lido sobre como os pipes são implementados no kernel do Linux e queria validar meu entendimento. Se eu estiver incorreto, a resposta com a explicação correta será selecionada.

  • O Linux tem um VFS chamado pipefs que é montado no kernel (não no espaço do usuário)
  • pipefs tem um único super bloco e é montado em sua própria raiz ( pipe: ), junto com /
  • 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 por shells para canalizar com o operador | (ou manualmente a partir de qualquer outro processo) cria um novo arquivo em pipefs que se comporta praticamente como um arquivo normal
  • O arquivo no lado esquerdo do operador de pipe tem seu stdout redirecionado para o arquivo temporário criado em pipefs
  • O arquivo no lado direito do operador de pipe tem seu stdin definido para o arquivo em pipefs
  • pipefs são armazenados na memória e através de alguma mágica do kernel, não devem ser paginados

Esta explicação de como os canais (por exemplo, ls -la | less ) funcionam corretamente?

Uma coisa que não entendo é como algo como o bash definiria um processo ' stdin or stdout para o descritor de arquivo retornado por pipe(2) . Ainda não consegui encontrar nada sobre isso.

    
por Brandon Wamboldt 05.08.2014 / 01:01

1 resposta

17

Sua análise até o momento está correta. A forma como um shell pode definir o stdin de um processo para um descritor de pipe pode ser (pseudocódigo):

pipe(p) // create a new pipe with two handles p[0] and p[1]
fork() // spawn a child process
    close(p[0]) // close the write end of the pipe in the child
    dup2(p[1], 0) // duplicate the pipe descriptor on top of fd 0 (stdin)
    close(p[1]) // close the other pipe descriptor
    exec() // run a new process with the new descriptors in place
    
por 05.08.2014 / 01:35

Tags