A leitura do processo de um pipe nomeado normalmente terminará quando a gravação do processo no pipe terminar a gravação (envia um EOF). Em determinadas situações, você pode ter diferentes processos gravando intermitentemente no pipe e deseja que um único processo leia continuamente do pipe. Para fazer isso, você pode configurar um escritor 'fictício' que abre o pipe, mas não grava nele:
$ mkfifo myPipe
$ cat > myPipe &
O gravador fictício mantém o pipe nomeado aberto - sem alimentar dados nele ou nunca fechar. O processo de leitura é, portanto, capaz de receber entrada de todos os (outros) escritores legítimos sem terminar e ter que ser reaparecido.
Eu vi algumas pessoas usarem exec 3>
em vez de cat
como uma maneira de manter o pipe nomeado aberto.
$ mkfifo myPipe
$ cat < myPipe &
[1] 10796
$ exec 3> myPipe
$ echo "blah" > myPipe
blah
Essa abordagem parece funcionar, e você não tem um escritor fictício em segundo plano para se preocupar (ou limpar), então eu gosto. O problema é que eu realmente não entendo.
Como está exec 3>
realizando a tarefa de manter o pipe nomeado aberto sem um arquivo real a ser executado ou um processo visível (em segundo plano), e existem desvantagens nessa abordagem?
(Sei que, em última análise, deve estar abrindo o descritor de arquivo de entrada do pipe nomeado para gravação, então estou especificamente interessado no que a exec 3
parte de exec 3>
está fazendo.)