Я пытаюсь исправить ошибку в цикле событий, который вызывает select()
. Когда select()
возвращает EBADF, регистрируется ошибка, тогда набор fd повторно инициализируется и выбор вызывается снова. Это приводит к бесконечному жесткому циклу регистрации, генерируя гигабайты журнала в считанные секунды.Должен ли я утверждать сбой при выборе() EBADF?
Эта ошибка возникает, если один из серверов tcp, к которому подключена моя программа, выполняет нечистое отсоединение (например, segfaults). В этом случае я бы идеально хотел, чтобы моя программа удаляла этот fd и продолжала работать (или отключается, если это невозможно).
Мой вопрос в том, должен ли() когда-либо возвращаться EBADF, или это указание на то, что моя программа глючит? То есть Должен ли я утверждать, что я не согласен с EBADF, или каким-то другим образом, как мне обращаться с ним? Пропустил бы ли я цикл fd, чтобы найти «плохой» дескриптор файла?
Это результат неаккуратного администрирования fd. В качестве последнего средства * вы можете вызвать 'fstat()' на всех fds в своих fd_sets и отсортировать их. – wildplasser