如何制作独立的叉子过程?

时间:2020-07-10 15:31:10

标签: c linux fork

我正在考虑通过在触发某些信号时分叉一个过程来实现高可用性策略。但是,我希望这个新进程不是执行fork的进程的子进程,而应该是其他某些进程的子进程。这很重要,因为我需要确保这个新的fork不会仅仅因为其他进程就死了。

我在这里查看fork,ecev,execs,clone等之间的区别:The difference between fork(), vfork(), exec() and clone()

但是,尽管如此,我仍在尝试寻找一种方法来克隆正在运行的进程并随时随地进行派生。有什么想法吗?

使用叉子:

process_one
    |
    |
    * ----->forked_process

我希望fork_process是另一个进程的子进程,但要是process_one。

新解决方案(不确定如何实现)

使用叉子:

process_one
    |
    |
    * -clones-->forked_process

然后

another_process
    |
    |
    * -child-->forked_process

1 个答案:

答案 0 :(得分:1)

您说:

我正在考虑通过在触发某些信号时分叉一个过程来实现高可用性策略。

您最好不要在信号处理程序中fork()新建一个进程,因为在系统调用之后,信号处理程序在用户模式下作为中断执行。这将使您的fork()调用在主代码中更难解释其返回值。可以这样做,但是会使您的代码变得不必要。

但是,我希望这个新进程不是执行fork的进程的子进程,而是其他进程的子进程。

您提出的要求完全不可能满足。 fork()只是在执行fork()系统校准的paren中创建一个子进程。该新的子进程是它的子进程,并且与父进程调用fork()调用(启动fork()的调用)处于相同的执行状态,而子进程< strong>只能通过fork() 的返回值与父项区分开,该返回值是子项的0,是父项中子项的新进程ID。这使得完全不可能选择父级(或选择您希望孩子成为父级的进程),因为通常父级是启动调用的进程,子级是接收调用返回值的进程。抱歉,父级收养仅由内核自动处理,这会使ID为1(根据系统的不同,为initsystemd的进程自动采用父进程exit(2)的子进程。

这很重要,因为我需要确保这个新的fork不会仅仅因为其他进程就死了。

没有理由将进程之间的fork()或父/子关系链接在一起,因为一个进程必须死掉是因为它的父进程确实死了。没有一个死亡进程会使另一个人死亡。当父进程死亡时,现在的孤立进程成为ID为1的进程的子进程。没有死的理由。每个进程(始终)都有一个父进程,并且每个进程仅在向其发送信号时或由于它明确地进行了exit(2)系统调用而死亡。进程的生命是彼此独立的,并且进程的死亡永远不会限制另一个进程的生命。