Eu tenho um programa que exibe uma mensagem de prompt e aguarda o usuário inserir algum texto.
$ program
Input a line of text: <aaaa>
Some more output.
$
Agora, também quero poder fornecer essa entrada, programaticamente, por meio de um FIFO, assim:
$ program < fifo
Mas o que está acontecendo é que o prompt em stdout não aparece até que eu forneça a entrada para fifo
.
Em seguida, tentei um equivalente muito simples do meu programa, assim:
$ echo aaaa < fifo
Mesmo aqui, aaaa
não aparece até fifo
que tenha sido fornecida sua entrada.
Descrição : Como faço para que minha saída até o ponto em que espero a entrada stdin
apareça stdout
ao usar FIFO?
O FIFO é aberto pelo shell, mas a abertura dele está bloqueando até que o FIFO seja aberto para escrita por algum outro processo. Como os redirecionamentos são processados antes da execução do comando, o programa não é executado até que a
open()
chamada do shell retorne. Este é o comportamento documentado para aopen()
função da biblioteca C (usada pelo shell):Portanto, o shell obviamente não está sendo usado
O_NONBLOCK
quando está abrindo o FIFO.Solução:
cat fifo | program
cat
lê do FIFO até o final do arquivo e sai.tail -f fifo | program
tail
lê do FIFO até o final do arquivo, então fica esperando por mais até ser finalizado.Qual destes é mais adequado para sua situação depende um pouco do que está escrevendo para o FIFO na outra extremidade e como ele faz a escrita.
A terceira solução envolve fazer com que o programa abra o FIFO quando necessário.
De acordo com a seção Rationale em
sh
, um shell deve definir a entrada padrão para bloqueio porque...