使用boost :: asio,我是否需要notify_fork来做一个简单的fork / exec

时间:2017-07-27 08:52:42

标签: boost boost-asio

我不清楚当我要做的就是做一个简单的fork / exec来启动另一个程序时是否需要使用notify_fork。

我的猜测是,notify_fork的预期用途是仅处理fork的情况,例如"每个连接的进程" (当你做一个分叉时,而不是另一个程序的执行者。

如果 ALL 我做的是一个简单的分支,然后是exec(说" ls"),我是否需要关注" notify_fork& #34;

1 个答案:

答案 0 :(得分:1)

我会说,是的。

如果意图是紧接着exec,那么有些人认为这无关紧要(毕竟你可以简单地关闭你不希望子进程继承的所有fds)。参见例如这个帖子中的讨论https://github.com/klemens-morgenstern/boost-process/issues/65

我在逻辑上同意,但是在进程中分叉/执行后,我在异步操作中出现了虚假的死锁。可悲的是,我完全不确定notify_fork总是有帮助。在某些时候,我有一个safe_io_service对象,确保进程中的所有io_service个实例都已注册,并在适当的时候进行notify_fork - 同时也同步fork操作.¹

总而言之,做notify_fork(prepare)notify_fork(parent)似乎不应该伤害²,它应该允许任何真正拥有宝贵服务的服务做正确的事。

即使有了这些,我仍然可以在异步操作中发生死锁。我曾经解释过这个问题的最热门话题是:epoll is fundamentally broken

  

TL; DR

     

最后,我不得不运送带有手动fork /exec³和手动异步IO循环的版本,而不是使用Asio。

     
      
  • 我们仍在积极使用Asio进行RPC套接字侦听器,
  •   
  • pthread_atfork确保同步fork()调用 io_service::notify_fork()来电的方法已经到位
  •   
     

我们没有看到使用它的问题。

¹我们使用pthread_atfork来实际触发此

²虽然我会采取预防措施使其同步(因此没有两个线程会同时分叉)。为了安全起见

³而不是使用Boost Process,它也使用Asio作为异步IO部件。当然,导致更少,更优雅的代码