У меня есть выбор на FDSET, который включает несколько TCP-соединений и одно несвязанное соединение UDP. В окнах, когда я закрываю сокет для UDP-соединения из другого потока, он сигнализирует о возврате select. В Ubuntu, однако, это не так, почему?
Если это зависит от того, пытаетесь ли вы закрыть fd во время select
или перед select
(и FD_SET
). В обоих случаях по причинам, изложенным ниже, поведение не определено. Возможно, это делает одну вещь под Windows, но вы не можете положиться на нее.
Если вы пытаетесь закрыть fd во время select
(т.е. После того, как был введен системный вызов select()
но до его возвращения), тогда поведение не определено по причинам, изложенным здесь: Что делает select (2), если вы закрыть (2) файловый дескриптор в отдельном потоке?
Если вы пытаетесь закрыть fd перед select
(и FD_SET
), тогда вы пытаетесь выполнить FD_SET
затем select()
в FD, который теперь закрыт, т.е. недействителен. Стандарт находится здесь: http://pubs.opengroup.org/onlinepubs/009695399/functions/select.html, и это говорит о том, FD_SET
макрос FD_SET
может даже не запрашивать select()
для просмотра вашего FD.
Поведение этих макросов не определено, если аргумент fd меньше 0 или больше или равен FD_SETSIZE, или если fd не является допустимым файловым дескриптором, или если какой-либо из аргументов является выражением с побочными эффектами.
Если это произойдет (и только если это произойдет), select
должен возвращать EBADF
:
При следующих условиях pselect() и select() должны выйти из строя и установить errno в:
[EBADF] В одном или нескольких наборах дескрипторов файлов указан файловый дескриптор, который не является допустимым дескриптором открытого файла.
Но вы не можете знать, что это будет так, поскольку FD_SET
может в равной степени просто игнорировать неверный дескриптор файла.
Для полноты, если вы делаете FD_SET
перед close
, но затем выполните select
, вы увидите EBADF
.
select()
когда вы закрываете FD? В этом случае поведение самой select()
не определяется стандартом POSIX (см. Ссылку, которую я отправил). IE может вернуться, а может и нет. См .: stackoverflow.com/questions/543541/…