EPIPE
com sua mensagem de erro "canal interrompido" é disparada quando o sinal SIGPIPE
está definido para ser ignorado e um processo de gravação tenta gravar saída adicional no final de leitura já fechado do canal onde, no seu caso , generate
tem todos os descritores de arquivos referentes a sua stdin fechada.
Se houver um processo pai que tenha definido o sinal SIGPIPE
a ser ignorado, o processo filho herdará esse comportamento (... e em shells não interativos isso não poderá ser desfeito).
Portanto, no seu caso, o programa que chama seu executável generate
definiu o sinal SIGPIPE
a ser ignorado. Então, quando o programa generate
no seu generate_wrapper
tiver processado a entrada por um segundo ( ulimit -t 1
) generate
sairá e fechará seu stdin. Se o seu processo de gravação com SIGPIPE
ignorado tentar gravar mais dados no stdin fechado de generate
, a chamada do sistema write
falhará e você verá EPIPE
com sua mensagem de erro "canal interrompido" (consulte man 2 write
).
Quanto a um wrapper para reduzir o consumo de recursos da CPU, use ferramentas como cstream ou mbuffer .
# test: ulimit -t
#help ulimit
{
time -p bash -c 'yes | head -100000000 | wc -c'
echo
time -p bash -c 'ulimit -t 1; yes | head -100000000 | wc -c'
}
# cstream test
#top -u
yes | cstream -b 100000 -t 100000 -o -
yes | cstream -b 100000 -t 100000 | cat -n
# generate_wrapper
#!/bin/bash
cstream -b 100000 -t 100000 | generate