【问题标题】:a flag of libev about ev_default_fork关于 ev_default_fork 的 libev 标志
【发布时间】:2012-08-01 11:32:29
【问题描述】:

我正在学习libev。 但我不了解ev_loopev_default_fork 标志。 这是关闭执行的问题吗?喜欢FD_CLOEXEC fcntl() 标志吗? 什么时候需要设置标志?什么情况下需要这个标志? 这是对文档的描述:

此函数设置一个标志,导致后续的 ev_loop 迭代 重新初始化具有内核状态的后端的内核状态。尽管 名字,你可以随时调用它,但它在之后最有意义 分叉,在子进程中(或子进程和父进程,但又一次 毫无意义)。在使用任何一个之前,您必须在孩子中调用它 libevfunctions,它只会在下一个 ev_loop 生效 迭代。

另一方面,你只需要在 childprocess 当且仅当您想在 孩子。如果你只是 fork+exec,你根本不需要调用它。

函数本身速度很快,通常不会有问题 callit 以防万一后叉。为方便起见,该函数将 非常适合调用 pthread_atfork:pthread_atfork (0, 0, ev_default_fork);

【问题讨论】:

    标签: c++ c io fcntl libev


    【解决方案1】:

    好吧,只是阅读文档,你在fork() 之后调用子函数,最好是你做的第一件事。所以你的代码应该是这样的:

    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;
    }
    

    【讨论】:

    • 为什么要这样做?如果我没有写 ev_default_fork(),会发生什么?
    • 这个 ev_default_fork() 像 FD_CLOEXEC fcntl() 标志一样工作吗?
    • 不,它与 FD_CLOEXEC 无关。 ev_default_fork() 只是做了一些内部技巧,所以默认的 loop 可以在 child 中使用。我的意思是,所有向父母注册的事件都将继续与孩子一起工作。如果你不这样做,那么默认循环的队列中有不可用的事件。
    • 主要版本 4 对 API 引入了一些不兼容的更改。ev_default_destroy 和 ev_default_fork 已被删除!!!!
    • 不,你看错了:它已被ev_loop_fork(EV_DEFAULT); 取代,我将更新我的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2013-11-07
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多