Há uma advertência sobre a leitura de um pipe nomeado. Quando você abre um pipe nomeado, a chamada open()
é interrompida até que um gravador seja exibido. Quando um gravador aparecer, as chamadas read()
subsequentes retornarão quaisquer dados que o gravador tenha gravado no pipe. No entanto, quando o gravador fecha o pipe (ou sai), as chamadas read()
começam a retornar 0 (em vez de bloquear).
Esta é a razão pela qual, em vez de
int fd = open("testpipe", O_RDONLY);
alguém pode querer abrir um pipe como este
int fd = open("testpipe", O_RDWR);
Desta forma, o processo não é apenas o leitor, mas também o escritor. Mesmo que você nunca realmente escreva nada para o pipe, isso garante que um gravador exista e, portanto, read()
chama não retorna 0, mas bloqueia em vez de esperar que algum gravador escreva algo no pipe. / p>
Agora, quando seu script faz isso:
while [ 1 -eq 1 ]
do
read input
...
done < $pipename
seu shell abre o pipe apenas para leitura ( O_RDONLY
).
A solução para o seu problema é fazer com que o shell abra o pipe para ler e escrever assim:
while [ 1 -eq 1 ]
do
read input
...
done <> $pipename
Observe a substituição de < $pipename
por <> $pipename
. Isso é o que faz com que o shell abra o pipe para leitura e gravação ( O_RDWR
).