O pipe nomeado fica "entupido"

1
for elem in {1..99} ; do echo $elem> mypipe ; done

Esta parte do código bash deve passar 99 ints pelo pipe, que anteriormente, em outro terminal, tinha esse conjunto:

cat <mypipe

Alguém sabe por que às vezes eu estou recebendo apenas um número aleatório (menos de 99) de ints passado pelo pipe, depois do qual ele trava? Eu tenho que terminar o script com Ctrl + c , e recebo esta mensagem:

bash: mypipe: Interrupted system call

Estou executando o Ubuntu 11.10.

    
por vlad-ardelean 06.02.2012 / 22:14

1 resposta

4

O problema com o seu código é que > mypipe abrirá o fifo, escreverá nele e depois o fechará. Uma vez fechado em qualquer das extremidades, você terá que reabri-lo em ambos . Então, em vez de reabrir o fifo para cada eco, mantenha-o aberto para todo o loop.

for elem in {1..99}; do echo "$elem"; done > mypipe

Btw, no lugar do loop, você poderia usar apenas um printf

printf '%s\n' {1..99} > mypipe

Se você tiver um caso mais complexo. Você pode atribuir um fd para ele.

exec 3> mypipe # opens mypipe for writing on fd 3

echo "stuff" >&3
echo "more stuff" >&3
...

exec 3>&-      # closes fd 3

Veja o link para saber mais.

    
por geirha 12.02.2012 / 11:00