Я пытаюсь выяснить, почему дочерний процесс может изменить родительское состояние epoll.
У меня есть программа, которая объявляет статический объект epoll (объект, который упаковывает epoll):
static EventManager* evMgrPtr = NULL;
Родительский процесс инициализировал его и использует его для отслеживания сокета прослушивания (родительский процесс — это, по сути, демон, которому иногда нужно отвечать на запрос проверки работоспособности, принимая этот запрос через сокет прослушивания).
Дети делают совершенно разные вещи, однако программа НЕ выполняет форк / exec, скорее, дети продолжают и запускают кусок кода в одном и том же модуле перевода.
pid_t pid = fork();
switch(pid) {
case -1:
YREPL_LOG_FATAL("Couldn't start server process ");
exit(EXIT_OK);
case 0:
#ifndef __FreeBSD__
assert( closeThisFd != -1 );
evMgr.unregisterSocketEvent( closeThisFd );
close( closeThisFd );
#endif
close(outpipe[0]);
close(errpipe[0]);
dup2(outpipe[1], 1);
dup2(errpipe[1], 2);
close(outpipe[1]);
close(errpipe[1]);
Проблема в том, что после того, как я выполняю evMgrPtr-> unregisterSocketEvent (closeThisFd) в дочернем процессе, я обнаружил, что родительский процесс также перестал наблюдать за сокетом прослушивания !!!
Может кто-нибудь пролить свет на то, почему это происходит. Я думал, что когда вилка будет выполнена, родитель и дети будут делать COW. Таким образом, что бы дети ни делали с его копией объекта epoll, это не должно отражаться в родительском праве?
Похоже, вы используете основанный на EPOLL цикл обработки событий. Таким образом, поскольку файловый дескриптор для самого объекта epoll является общим для дочернего и родительского объекта, удаление файлового дескриптора из основанного на epoll () дескриптора в дочернем объекте также влияет на родительский процесс :). Пожалуйста, прочитайте man epoll, man epoll_create.
Других решений пока нет …