2016-02-24 24 views
0

我想打电话ev_loop_fork,如果我不叫ev_loop_fork的孩子,那么儿童观察者就不会被触发。发生了什么,如果我没有在孩子

这是我的代码,我建立与EVBACKEND_EPOLLEVFLAG_NOENV标志的ev_loop。

因此没有EVFLAG_FORKCHECK标志。

然后我发表评论ev_loop_fork打电话给孩子。

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

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

$ 4980叉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; 
} 

回答

0

libev手册中并没有说fork后一个事件循环将会停止。它所说的是,要确保事件循环将正确工作在孩子,您需要调用ev_loop_fork()。实际发生的情况取决于后端。在技​​术上,定时器甚至在大多数后端对叉具有更强的弹性:select(),poll(),epoll(),kqueue都允许规定一个超时值,之后这些函数在没有事件的情况下返回。 libev使用此功能可以在应该触发时触发超时。所以没有必要重新注册任何文件描述符以使超时工作。

相关问题