我不清楚当我要做的就是做一个简单的fork / exec来启动另一个程序时是否需要使用notify_fork。
我的猜测是,notify_fork的预期用途是仅处理fork的情况,例如"每个连接的进程" (当你做一个分叉时,而不是另一个程序的执行者。
如果 ALL 我做的是一个简单的分支,然后是exec(说" ls"),我是否需要关注" notify_fork& #34;
答案 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部件。当然,导致更少,更优雅的代码