Блокировка recv не завершается при закрытии сокета из другого потока? - PullRequest
2 голосов
/ 02 сентября 2010

В Linux, если мы вызываем блокировку recv из одного потока и закрываем для того же сокета из другого потока, recv не завершается.

Почему?

Ответы [ 2 ]

11 голосов
/ 02 сентября 2010

«почему» просто так устроено.

В ядре вызов recv() вызвал fget() в struct file, соответствующем дескриптору файла, иэто предотвратит его освобождение до тех пор, пока соответствующий fput().

Вам просто придется изменить свой дизайн (в любом случае, ваш дизайн по своей природе является очень быстрым - для этого вам не нужно блокировать защиту дескриптора файла).в пользовательском пространстве, что означает, что close() мог произойти просто за до вызова recv() - и дескриптор файла даже был повторно использован для чего-то другого).


Если выесли вы хотите разбудить другой поток, блокирующий дескриптор файла, вы должны вместо этого заблокировать его на select(), с включенным в набор дескрипторов файла каналом, в который может записывать основной поток.

7 голосов
/ 02 сентября 2010

Убедитесь, что все файловые дескрипторы для сокета были закрыты. Если какие-либо из них остаются открытыми на «удаленном конце» (при условии, что вы пытаетесь закрыть его), « узел не выполнил упорядоченное отключение ».

Если это все еще не работает, вызовите shutdown(sock, SHUT_RDWR) на удаленном конце, это отключит сокет независимо от количества ссылок.

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