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.)
Você está analisando errado; é
exec
e3>fifo
nãoexec 3
e>fifo
.exec
sem um comando aplica qualquer redirecionamento ao shell principal, e o>
redirecionamento pode receber um argumento de descritor de arquivo (como em3>
) em vez do implícito1
(stdout).Quanto às suas desvantagens, o descritor de arquivo aberto será passado para subprocessos/subshells e, a menos que seja fechado explicitamente (com
exec 3>&-
) em cada um deles , fará com que qualquer leitor na outra extremidade do pipe não obtenha um EOF até que todos esses subprocessos ter saído.Ainda outro truque para manter um pipe aberto, e que também fará com que ele não bloqueie ao abri-lo, é abri-lo no modo de leitura e gravação: