Закройте сокет и выберите () - PullRequest
2 голосов
/ 28 марта 2010

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

Будет ли выбор завершен изящно () или произойдет что-то плохое?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2010

См. Ответ, который я получил почти на тот же вопрос:

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

Краткий ответ: пусть ваш вызов select ждет на двух дескрипторах файла: сокете и стороне чтения канала.

0 голосов
/ 28 марта 2010

Я не уверен на 100%, но ничего плохого не произойдет, если вы закроете сокет после запуска select(). select() вернет ошибку, если вы передадите ей уже закрытый сокет в начале (см. man-страницу ).

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

Вы можете написать простую программу и реально проверить, что произойдет в вашей системе.

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