C 如何制作一个分离的fork进程?

C 如何制作一个分离的fork进程?,c,linux,fork,C,Linux,Fork,我正在考虑实施一种高可用性策略,即在触发某个信号时分叉一个进程。但是,我希望新流程不是执行fork的流程的子流程,而是其他流程的子流程。这很重要,因为我需要确保这个新的fork不会因为另一个进程死亡而死亡 我在这里看到了fork、ecev、execs、clone等之间的差异: 但是,我仍然试图找到一种方法来克隆一个正在运行的进程,并在运行中获得一个fork。有什么想法吗 使用fork: process_one | | * ----->forked_process

我正在考虑实施一种高可用性策略,即在触发某个信号时分叉一个进程。但是,我希望新流程不是执行fork的流程的子流程,而是其他流程的子流程。这很重要,因为我需要确保这个新的fork不会因为另一个进程死亡而死亡

我在这里看到了fork、ecev、execs、clone等之间的差异:

但是,我仍然试图找到一种方法来克隆一个正在运行的进程,并在运行中获得一个fork。有什么想法吗

使用fork:

process_one
    |
    |
    * ----->forked_process
process_one
    |
    |
    * -clones-->forked_process
我希望forked_进程是另一个进程的子进程,但是process_是另一个进程的子进程

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

使用fork:

process_one
    |
    |
    * ----->forked_process
process_one
    |
    |
    * -clones-->forked_process
然后

another_process
    |
    |
    * -child-->forked_process
你说:

我正在考虑实施一种高可用性策略,即在触发某个信号时分叉一个进程

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

但是,我希望新流程不是执行fork的流程的子流程,而是其他流程的子流程

你提出的要求完全无法满足
fork()
只是在执行
fork()
系统调用的paren中创建一个子进程。新的子进程是它的一个子进程,并且与父进程在调用
fork()
调用(启动
fork()
的调用)时处于相同的执行状态,并且子进程只能通过返回值
fork()
来与父进程区分,它是子进程的
0
,是父进程中子进程的新进程id。这使得完全无法选择父进程(或选择希望子进程作为父进程的进程),因为父进程总是启动调用的进程,而子进程是接收调用返回值的进程。很抱歉,父进程采用仅由内核自动处理,这使得id为
1
的进程(这是
init
systemd
,取决于系统)在父进程退出(2)时自动采用子进程

这很重要,因为我需要确保这个新的fork不会因为另一个进程死亡而死亡


没有理由将
fork()
或进程之间的父/子关系链接在一起,因为一个进程必须死亡,因为它的父进程已经死亡。没有死亡的过程会使另一个死亡。当父进程死亡时,现在的孤立进程将成为id为
1
的进程的子进程。没有死亡的理由。每个进程都有一个父进程(始终),并且每个进程只有在向其发送信号时,或者因为它显式地进行了
exit(2)
系统调用时才会终止。进程寿命相互独立,进程的死亡不会影响另一进程的寿命。

如果父进程先终止,子进程不会死亡。如果父进程异常终止,该怎么办?另外,一旦父进程分叉了一个子进程,它还能正常运行吗?分叉后父进程和子进程是分开的谢谢!那么这个呢?在子进程中可以做的事情是有限的。为了完全安全,您应该限制自己只执行异步信号安全操作,直到调用某个exec函数为止。任何框架或库中的所有API(包括全局数据符号)在fork()之后都应该被认为是不安全的,除非明确说明是安全的或异步信号安全的。如果需要在子流程中使用这些框架,则必须执行。在这种情况下,执行自己是合理的。这意味着什么?经典的方法是“双叉”。你用叉子叉一次。那个孩子叉出第二个孩子并立即离开。“孙子”然后由init继承。(或者不管这个过程现在叫什么。)