2012-08-01 28 views
0

我在学习libev。 但我不明白ev_loop的标志ev_default_fork。 这是一个关于exec的问题吗?像FD_CLOEXEC fcntl()标志吗? 当我需要设置标志?哪种情况下这个标志是必要的? 此文档的描述:关于ev_default_fork的libev国旗

该功能设定使后续ev_loop iterationsto 重新初始化内核状态具有一个后端的标志。尽管 名字,你可以随时调用它,但它最有意义后 分叉,在子进程(或儿童和父母,但再次 使littlesense)。在使用任何自由函数之前,必须在孩子中调用它,它只会在下一次ev_loop 迭代中生效。

另一方面,当且仅当您想要使用 孩子中的事件库时,您只需要在 子进程中调用此函数。如果你只是fork + exec,你根本不需要调用它。

该功能本身相当快,通常不会出现问题 以防叉后出现。为了方便起见,函数 fit会很好地调用pthread_atfork:pthread_atfork(0, 0,ev_default_fork);

回答

2

也仅仅阅读文件,调用在子功能fork()后,preferrably你要做的第一件事。所以你的代码应该看起来像:

switch (fork()) { 
case -1: 
    /* everything's gone pear-shaped */ 

default: 
    /* i am the parent */ 
    ... 
    break; 

case 0: 
    /* i am the child */ 
    ev_loop_fork(EV_DEFAULT); 
    ... 
    break; 
} 
+0

为什么要这样?如果我没有写ev_default_fork(),会发生什么? – simon 2012-08-01 13:02:29

+0

这个ev_default_fork()工作像FD_CLOEXEC fcntl()标志吗? – simon 2012-08-01 13:04:54

+0

不,这和FD_CLOEXEC没有关系。 'ev_default_fork()'只是做了一些内部的技巧,所以默认的**循环**可以用在孩子身上。我的意思是,所有向父母登记的事件都将继续与孩子一起工作。如果你不这样做,那么默认循环在队列中有不可用的事件。 – hroptatyr 2012-08-01 13:08:10