如果我没有在孩子身上调用ev_loop_fork,会发生什么

时间:2016-02-24 14:03:46

标签: fork child-process libev

我想,如果我没有给孩子打电话 ev_loop_fork ,那么孩子的观察者就不会被触发。

这是我的代码,我使用 EVBACKEND_EPOLL EVFLAG_NOENV 标记构建ev_loop。

所以没有 EVFLAG_FORKCHECK 标志。

然后我评论孩子中的 ev_loop_fork 电话。

如果一切顺利,我认为孩子不会触发超时回调功能。

但实际上,输出是这样的:

  

$ 4980 fork 4981

     

$ 4980的时间

     

$ 4981的时间

似乎观察者仍然在孩子中被触发,它的表现与调用 ev_loop_fork 相同。

问题是什么,谢谢。

#include<ev.h>
#include<stdio.h>
#include<unistd.h>

void timeout_cb(EV_P_ ev_timer *w,int revents)
{
    printf("time out at %d\n", getpid());
    ev_break(EV_A_ EVBREAK_ONE);
}

int main()
{
    int ret;
    ev_timer timeout_watcher;

    struct ev_loop *loop = ev_default_loop(EVBACKEND_EPOLL | EVFLAG_NOENV);

    ev_timer_init(&timeout_watcher,timeout_cb,5.5,0.);
    ev_timer_start(loop,&timeout_watcher);
    ret = fork();
    if(ret>0) printf("%d fork %d\n",getpid(),ret);
    else if(ret==0)
    {
        //ev_loop_fork(EV_DEFAULT);
    }
    else return -1;
    ev_run(loop,0);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

libev手册没有说在fork之后会停止一个事件循环。它说的是为了确保事件循环正确在孩子中工作,你需要调用ev_loop_fork()。实际发生的事情取决于后端。

从技术上讲,定时器在大多数后端中甚至可以更好地抵御分支:select(),poll(),epoll(),kqueue都允许指定超时值,之后这些函数在没有事件的情况下返回。 libev使用此功能可以在它们被触发时触发超时。所以没有必要重新注册任何文件描述符以便超时工作。