Ваш стандартный вывод не был закрыт, поэтому проверка на это будет бесполезной.Ваша программа получила SIGPIPE и завершена.SIGPIPE доставляется всякий раз, когда ваша программа пишет в канал, на котором нет читателей.В вашем примере это происходит, когда head
выходит, закрывая его стандартный ввод.
Вы должны игнорировать SIGPIPE, если хотите, чтобы ваша программа продолжала работу.Этот код будет игнорировать SIGPIPE:
(void)signal(SIGPIPE, SIG_IGN);
Если вы не хотите изменять свою программу, вы можете организовать что-то продолжающее читать из канала, даже после того, как head
закроет свой ввод. 1
./a.out | ( head -n10 >dumped ; cat > /dev/null )
1 : пример оболочки действителен для bash, возможно, не для csh.