Может ли запись в сокет датаграммы когда-либо вызывать SIGPIPE? - PullRequest
5 голосов
/ 14 апреля 2011

Я работаю с некоторым кодом, который должен быть защищен от убийства вызывающего абонента из-за SIGPIPE, но единственные записи сокетов, которые он выполняет, идут в сокеты датаграмм (как в дейтаграммах сокетов домена UDP, так и в домене Unix).Мне нужно беспокоиться о SIGPIPE?Я использую connect в сокете, но предварительное тестирование (в Linux) показало, что я просто получаю ECONNREFUSED при отправке, если никто не слушает сокет домена Unix.Не уверен, что происходит с UDP.

Я могу обернуть все это в хаки, чтобы избавиться от SIGPIPE, но если это не проблема, я бы предпочел сэкономить накладные расходы и снизить сложность кода.

Ответы [ 3 ]

8 голосов
/ 12 сентября 2012

Открытая группа - это одно, а Apple - другое.Определенно возможно получить SIGPIPE на iOS при записи в неработающий UDP-сокет, как показали некоторые из моих журналов сбоев в последнее время.iOS имеет тенденцию закрывать сокеты UDP, когда приложение находится в фоновом режиме, при записи в эти сокеты может появиться SIGPIPE.Из моего журнала сбоев (любезно предоставлено testflightapp):

Исключение Последние события, связанные с жертвамиSIGPIPE2 libsystem_c.dylib 0x32df47ec _sigtramp + 483 мгновенных разговора 0x0005b10e - [IPRSNetDatagramSocket send: size: to:] (iprs_iphone_net.m: 671) ...

Не помню, чтобы это происходило в Linux, Solaris или Windows - хотя я никогда не пытался закрыть сокет, а затем записать в него.

8 голосов
/ 14 апреля 2011

Ответ указан в спецификации для send:

[EPIPE] Гнездо выключено для записи или гнездо находится в режиме соединения и больше не подключено.В последнем случае, если сокет имеет тип SOCK_STREAM или SOCK_SEQPACKET и флаг MSG_NOSIGNAL не установлен, сигнал SIGPIPE генерируется для вызывающего потока.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html

Таким образом, нет, запись в сокеты датаграмм не генерирует SIGPIPE или EPIPE ошибку.

1 голос
/ 14 апреля 2011

Согласно man 2 write на моей коробке Debian,

EPIPE: fd подключен к трубе или сокету, конец чтения которого закрыт.Когда это происходит, процесс записи также получит сигнал SIGPIPE.(Таким образом, возвращаемое значение записи отображается только в том случае, если программа перехватывает, блокирует или игнорирует этот сигнал.)

Похоже, что при записи в сокет можно получить SIGPIPE, но не ясно, может лив частности, для UDP-сокетов.

...