Сейчас мне кажется что правильней всего было бы его игнорировать и возвращать EPIPE чтобы эту ситуацию можно было обрабатывать по аналогии с другими ошибками на потоках...
логика очень простая, берем программу которая печатает
в stdout и программу которая читает из stdin и соединяем их,
./program1 | ./program2
обычно писатели в stdout, результат write не проверяют,
(например, во многих программах вы видели чтобы
делали if (printf() != bla-bla) и так на каждую печать)
с другой стороны хочется чтобы если program2 по каким-то
причинам прекратила работу, program1 тоже бы завершилась незамедлительно,
поэтому SIGPIPE по умолчанию так обрабатывается,
и с glibc это никак не связано, так же будет и на любом другом
unix