【发布时间】:2020-07-10 15:31:10
【问题描述】:
我正在考虑通过在触发某个信号时分叉一个进程来实现高可用性策略。但是,我希望新进程不是执行分叉的进程的子进程,而可能是其他进程的子进程。这很重要,因为我需要确保这个新的分叉不会因为其他进程死亡而死亡。
我在这里查看了 fork、ecev、execs、clone 等之间的区别:The difference between fork(), vfork(), exec() and clone()
但是,我仍然试图找到一种方法来克隆正在运行的进程并在旅途中获得一个 fork。有什么想法吗?
使用分叉:
process_one
|
|
* ----->forked_process
我希望 forked_process 成为另一个进程的子进程,但 process_one。
新的解决方案(不知道如何实现)
使用分叉:
process_one
|
|
* -clones-->forked_process
然后
another_process
|
|
* -child-->forked_process
【问题讨论】:
-
如果父进程先终止,子进程不会死。
-
如果parent异常终止怎么办?另外,父母分叉孩子后还能正常运行吗?
-
fork后父子进程分离
-
谢谢!那这个呢?您可以在子进程中执行的操作是有限制的。为了完全安全,您应该限制自己只执行异步信号安全操作,直到调用其中一个 exec 函数。任何框架或库中的所有 API,包括全局数据符号,都应该在 fork() 之后被假定为不安全,除非明确记录为安全或异步信号安全。如果你需要在子进程中使用这些框架,你必须执行。在这种情况下,执行自己是合理的。这是什么意思?
-
经典方法是“双叉”。你分叉一次。那个孩子分叉了第二个孩子并立即退出。 “孙子”然后由 init 继承。 (或任何现在调用的过程。)