我试图弄清楚为什么子进程能够改变父epoll状态。
我有程序声明一个静态的epoll对象(包装epoll的对象):
static EventManager* evMgrPtr = NULL;
父进程初始化它并使用它来监视侦听套接字(父进程基本上是一个守护进程,偶尔需要通过侦听套接字接受这些请求来响应运行状况检查请求)。
孩子们完全不同,但是,程序不做fork / 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)之后,我发现父进程也停止监听侦听套接字!
任何人都可以解释为什么会这样。我以为一旦执行了fork,父级和子级就会执行COW。所以,无论孩子对epoll对象的副本做了什么,都不应该反映在父对象身上?
答案 0 :(得分:0)
您似乎使用基于EPOLL的事件循环。因此,由于epoll-object本身的文件描述符在子节点之间共享,因此从子节点中基于epoll()的描述符中删除文件描述符也会影响父进程:)。请阅读man epoll,man epoll_create。