【发布时间】:2014-02-23 20:50:54
【问题描述】:
我试图弄清楚为什么子进程能够更改父 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 ) 后,我发现父进程也停止监视监听套接字了!!!
谁能解释一下为什么会这样。我认为一旦执行叉子,父母和孩子就会做牛。因此,无论子代对其 epoll 对象的副本所做的任何事情都不应反映在父代中,对吧?
【问题讨论】:
-
文件描述符在整个继承进程空间中是唯一的。如果您想独立处理子进程,请参考
dup()。 -
我不认为我想 dup() 继承的 fd。我要做的就是让父级继续监听端口,同时阻止任何后续分叉的子级监听端口。