2014-10-24 2 views
2

Предположит, я создаю Epoll дескриптор файла (э.п.п.м.) при вызовеЧто происходит, когда дескриптор файла epoll закрыт?

epfd = epoll_create(10); 

Далее я добавить некоторое количество дескрипторов файлов в этот набор, вызвав epoll_ctl (э.п.п.м., EPOLL_CTL_ADD, ...) и ждать событий в цикле обработки событий путем вызова epoll_wait в отдельном потоке.

Что случилось, если я закрою epfd (по вызову close (epfd) в потоке, иначе, чем epoll_wait thread), когда набор epoll не пуст и epoll_wait (epfd, ...) выполняется? Заканчивается ли epoll_wait? С какими результатами?

ответ

1

Как и ожидалось, Linux делает то же самое, что и для select(2). На странице руководства:

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

И от select(2) страницы:

Если дескриптор файла под контролем select() закрыта в другом нить, то результат не определен. [...] В Linux (и некоторых других систем), закрытие файла в другом потоке не имеет никакого эффекта на select()

ТЛ; дг; это «не делать»:

В заключение, любое приложение, которое опирается на определенное поведение в этот сценарий должен рассматриваться багги.

Смежные вопросы