【问题标题】:C - Atomic killpgC - 原子杀戮
【发布时间】:2016-04-18 23:02:09
【问题描述】:

我有很多分叉的进程。子进程做很多事情和另一个系统调用。
当任何子进程从系统调用中收到错误时,它会将错误描述打印到 stderr 并将 SIGUSR1 发送给组长(主要父进程)。
SIGUSR1 告诉父进程杀死所有子进程,释放资源并退出程序执行(以避免僵尸进程)。

我需要一次杀死所有的孩子。原子地。因此,当任何子进程发生任何错误时,所有子进程都会立即停止工作。
当前父进程使用 SIGUSR2 杀死所有子进程 - 它将此信号发送给所有进程组成员 (killpg) - 他们都安装了信号处理程序来杀死它们(退出) - 虽然组长不会被杀死(它仍然需要释放资源)。

问题是,在所有子进程被杀死之前,它们仍然可以执行大约 1-2 行代码,这不是我想要的。我需要立即阻止他们。

我怎样才能做到这一点?

【问题讨论】:

  • 你怎么知道他们可以在被杀之前执行 1-2 行代码?
  • 因为我看到了。他们做一些系统调用并输出一些东西,其中一些在被杀死之前做一些输出。我只知道,相信我:)
  • 但是你怎么知道他们在收到信号和死亡之间执行了 1-2 行,而不是在信号发送之前没有执行 1-2 行?
  • 因为发送信号时,会立即杀死子进程
  • 如果子进程被立即杀死,那么为什么问题说子进程没有被立即杀死?

标签: c parallel-processing kill-process


【解决方案1】:

信号以异步方式传递,因为父进程和子进程都在运行,你不能指望子进程会在父进程发送信号时立即处理信号。

问题是在所有子进程被杀死之前,它们仍然可以执行大约 1-2 行代码,这不是我想要的。我需要立即阻止他们。

您的问题更多是进程之间的协调和同步,而不是信号句柄。我能想到的方法有两种:

  1. 使用同步信号。也就是当每个孩子向父母发送SIGUSR1时,他们停止工作,并通过等待函数等待SIGUSR2信号,如sigtimedwaitsigwait,这样他们就不会运行任何额外的代码在退出之前。

  2. 使用pipesocketpair创建父母与孩子之间的沟通渠道,即父母向孩子发送杀死指令,每个孩子将释放必要的资源并杀死自己。这就要求孩子们一边工作一边收听频道。

【讨论】:

    【解决方案2】:

    您的意思是所有子进程必须在故障子进程发送 SIGUSR1 后立即停止工作?

    如果这是您想要的,我认为您无法按照您的方式实现此目的:当有故障的孩子将 SIGUSR1 发送给领导者时,其他孩子将继续执行,直到领导者处理 SIGUSR1。

    您真的需要错误的进程先将 SIGUSR1 发送给领导者吗?故障进程是否有可能直接将 SIGUSR2 发送给组,领导者可以忽略该信号(或者至少不作为终止信号处理)?

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2015-08-25
      • 1970-01-01
      • 2010-11-09
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多