我试图弄清楚为什么子进程能够更改父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对象副本所做的任何操作都不应反映在父级权限中?

最佳答案

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

关于c++ - 子进程能够更改父epoll状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21974334/

10-14 17:04