Первое, что вы должны сделать, это позвонить signal(SIGPIPE, SIG_IGN);
, чтобы избежать получения SIGPIPE
на send()
или, в Linux, передать флаг MSG_NOSIGNAL
на send()
.Сделав это, send()
не будет генерировать сигнал SIGPIPE
при отключении узла, а скорее вернет -1 с помощью errno == EPIPE
.
Отправка SIGPIPE
является историческим поведением функции write()
.http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html
EPIPE
Предпринята попытка записи в канал или FIFO
, который не открыт для чтения каким-либо процессом, или который имеет только один открытый конец.Сигнал SIGPIPE
также должен быть отправлен в поток.
Первоначально он был создан для труб оболочки (например, cmd | other_cmd
).Когда ctrl-c
нажата во время выполнения оболочки, только последний процесс в канале получает SIGINT
и завершается.Для завершения других процессов в канале SIGPIPE
отправляется процессу, пытающемуся write()
в STDOUT
, чей считыватель уже завершен.