【问题标题】:How to make a detached fork process?如何制作一个分离的fork进程?
【发布时间】: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 继承。 (或任何现在调用的过程。)

标签: c linux fork


【解决方案1】:

你说:

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

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

但是,我希望新进程不是执行分叉的进程的子进程,而可能是其他进程的子进程。

你提出的要求是完全不可能满足的。 fork() 只是在执行fork() 系统校准的括号中创建一个子进程。那个新的子进程是它的一个子进程,并且与父进程在调用fork() 调用(启动fork() 的那个)时处于相同的执行状态,并且子进程只能通过fork()的返回值与父级区分开来,子级为0,是父级中子级的新进程id。这使得完全不可能选择父进程(或选择您希望子进程作为父进程的进程),因为父进程始终是启动调用的进程,而子进程是接收调用返回值的进程。抱歉,父进程仅由内核自动处理,这使得 ID 为 1 的进程(这是initsystemd,取决于系统)在父进程 @ 时自动采用子进程987654332@s.

这很重要,因为我需要确保这个新的分叉不会因为其他进程死亡而死亡。

没有理由将fork() 或进程之间的父/子关系联系在一起,因为一个进程必须死掉是因为它的父进程死了。没有一个死亡过程会导致另一个死亡。当父进程死亡时,现在的孤立进程将成为 ID 为 1 的进程的子进程。没有理由死。每个进程都有一个父进程(总是),每个进程只有在向它发送信号时才会死亡,或者因为它显式地进行了exit(2) 系统调用。进程的生命是相互独立的,一个进程的死亡永远不会影响另一个进程的生命。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2011-07-20
    • 1970-01-01
    • 2016-01-01
    • 2021-02-26
    • 2014-03-23
    • 2022-01-13
    • 2012-08-15
    相关资源
    最近更新 更多