Quando um gravador grava em um pipe e o pipe está cheio (seu tamanho é limitado a alguns kilobytes), seu processo bloqueia até que um dos leitores libere algum espaço. Da mesma forma, quando um leitor lê de um pipe, seu processo bloqueia até que haja algo lá.
Há também gravações e leituras assíncronas que um programador pode usar para enfileirar essas leituras e gravações.
Eu sugiro que leia Gudes de Beej , começando com Beej's Guia para a comunicação entre processos Unix
Você o chama com dois argumentos, o primeiro é um tempo de sono para o escritor, o segundo é um tempo de sono para o leitor. Tente chamá-lo com args 0 3
e 3 0
#!/bin/sh
write_sleep=$1
read_sleep=$2
writer(){
echo writing output >&2
echo hi
sleep $write_sleep
echo writing output >&2
echo hi
sleep $write_sleep
echo writing output >&2
echo hi
sleep $write_sleep
}
reader(){
while true; do
echo getting input >&2
read input
[ $input ] || { echo input is empty >&2 && break; }
echo $input
sleep $read_sleep
done
}
writer | reader