子进程能够改变父epoll状态

时间:2014-02-23 20:50:55

标签: c++ linux epoll

我试图弄清楚为什么子进程能够改变父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对象的副本做了什么,都不应该反映在父对象身上?

1 个答案:

答案 0 :(得分:0)

您似乎使用基于EPOLL的事件循环。因此,由于epoll-object本身的文件描述符在子节点之间共享,因此从子节点中基于epoll()的描述符中删除文件描述符也会影响父进程:)。请阅读man epoll,man epoll_create。