Сокеты Linux, завершающие поток прослушивания - PullRequest
1 голос
/ 11 сентября 2011

У меня есть поток, который по сути только для прослушивания на сокете. У меня есть поток, блокирующий на accept () в настоящее время.

Как сказать потоку завершить любую текущую транзакцию и прекратить прослушивание, а не оставаться заблокированным при принятии?

Я не хочу делать неблокирование, если мне не нужно ...

Ответы [ 4 ]

0 голосов
/ 12 сентября 2011

С Пробуждение потока заблокировано при вызове accept ()

Я только что использовал системный вызов shutdown (), и похоже, что он работает ...

0 голосов
/ 11 сентября 2011

По сути, у вас есть две опции, первая - использовать прерывания: т.е. http://www.cs.cf.ac.uk/Dave/C/node32.html (см. Раздел обработчика сигнала, он также предоставляет пример th_kill).

На странице справки о принятии:

accept() shall fail if:
EINTR
    The system call was interrupted by a signal that was caught before a valid connection arrived. 

Другой вариант - использовать неблокирующие сокеты и select(): т.е.: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6xnonblock.htm

В любом случае, обычно в несколькихВ многопоточных серверах есть один поток, который принимает новые соединения и порождает другие потоки для каждого соединения.Так как accept () и чем recv () могут задержать запросы на новые подключения ... (Если вы не работаете с одним клиентом, а затем accept () и получение могут быть в порядке)

0 голосов
/ 11 сентября 2011

Используйте pthread_cancel в теме.Вам нужно убедиться, что вы установили соответствующие обработчики отмены (pthread_cleanup_push), чтобы избежать утечек ресурсов, и вам следует отключить отмену, за исключением продолжительности вызова accept, чтобы избежать условий гонки, когда запрос отмены может быть выполненпозже другой функцией, отличной от accept.

Обратите внимание, что из-за ошибок в реализации отмены в glibc этот подход может привести к потере соединений и утечкам дескриптора файла.Это связано с тем, что glibc / NPTL не дает никаких гарантий, что accept еще не завершил выполнение и не выделил новый файловый дескриптор для нового соединения до того, как был выполнен запрос на отмену.Это должно быть довольно редкое явление, но это все еще проблема для рассмотрения ...

См .: http://sourceware.org/bugzilla/show_bug.cgi?id=12683

и для обсуждения проблемы: Реализация отменяемых системных вызовов в пользовательском пространстве

0 голосов
/ 11 сентября 2011

Используйте вызов select (2) , чтобы проверить, какие fd готовы к чтению.

Файловые дескрипторы вызова могут быть прочитаны без блокировки. например, accept() на возвращенном fd немедленно создаст новое соединение.

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