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