реентерабельная функция read () - PullRequest
3 голосов
/ 09 апреля 2011

Я нашел сервер по select(), который я хочу получить от некоторых клиентов.

Но я обнаружил, что сервер будет заблокирован в read() с помощью gdb.

Поэтому я решил решить эту проблему, добавив SIGALRM, но когда происходит тайм-аут, он все равно блокируется в read().

Это происходит потому, что системные вызовы автоматически перезапускаются, read() не прерывается при возврате обработчика сигнала SIGALRM.

Верна ли эта интерпретация?

1 Ответ

2 голосов
/ 09 апреля 2011

Обычное решение этой проблемы - использовать команду F_SETFL * *1005* от SOCK_NONBLOCK до socket(2).Как только сокет помечен как неблокирующий, он никогда не будет блокироваться при попытке чтения из него, и вам не нужно будет пытаться преодолеть разрыв между блокированием или неблокированием.Вы уверены select(2) установить дескриптор файла?Страница man select(2) описывает одну причину, по которой вы видите то, что видите, но это маловероятно:

В Linux select() может сообщить дескриптор файла сокета как «готово».для чтения », хотя, тем не менее, последующие блоки чтения.Это может, например, произойти, когда данные поступили, но при проверке они имеют неверную контрольную сумму и отбрасываются.Могут быть другие обстоятельства, при которых файловый дескриптор ложно сообщается как готовый.Поэтому может быть безопаснее использовать O_NONBLOCK на сокетах, которые не должны блокироваться.

Если вы действительно просто хотите предотвратить автоматический перезапуск, посмотрите на SA_RESTART в sigaction(2), чтобы предотвратить перезапуск системызвонки с перезапуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...