【问题标题】:Can't kill all child processes using SIGTERM无法使用 SIGTERM 杀死所有子进程
【发布时间】:2022-01-03 08:30:28
【问题描述】:

我的程序有以下父子布局:

int main() { 

std::vector<pid_t> kids;
pid_t forkid = fork();

if (forkid == 0) {
//child process
    pid_t fork2 = fork() 
    if (fork2 == 0) {
      // child process 

     }else {
      //parent
      kids.push_back(fork2);
     }
}else {
// code here
   kids.push_back(forkid);
}

// Not killing the fork2 process - only the first process(forkid) is terminated

for (pid_t k : kids) {
    int status;
    kill(k, SIGTERM);
    waitpid(k, &status, 0);
}


  }

我无法终止子进程 (fork2) - 第一个进程被终止。 kids 向量似乎只包含第一个进程的进程 ID。永远不会得到子进程的pid。 我在这里做错了什么。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 问题是,child1 必须杀死 child2,(因为 child2 pid 在 child1 的 kids 向量中),但是 child1 在杀死 child2 之前就被杀死了。

标签: c++ pipe fork termination


【解决方案1】:
std::vector<pid_t> kids;
pid_t forkid = fork();

fork() 创建父进程的完整复制图像作为其子进程。强调:重复

这意味着,例如,子进程有其非常自己的 kids 向量,无论如何,它与父进程的原始 @ 无关987654324@矢量。

因为这是main 中发生的第一件事,所以这实际上与您运行此可执行文件两次没有什么不同,分别作为两个不同且独立的进程,而不是fork 关闭一个进程。您不能期望两个进程之一中的kids 向量对另一个进程中的kids 向量有任何影响。

第一个子进程创建第二个子进程,并将第二个子进程的 pid 添加到它自己的kids 向量中。但这只是第一个子进程的kids 向量。

原始父进程的kids 向量最终拥有的唯一进程ID 是它的第一个子进程,所以这就是SIGTERM 的全部内容。

您的选择是:

  1. 重构您的逻辑,以便两个子进程都由父进程创建,因此它单独将它们的进程 ID 放入其 kids 向量中。 p>

  2. 不要使用fork,而是使用多个执行线程和同一个进程。但是,std::vector 和任何其他 C++ 库容器都不是线程安全的。需要编写大量代码来正确同步线程,以使事情正常进行(更不用说SIGTERM 的类似物,关于多个执行线程,需要在某种方式)。

最简单的选择是第一个。

【讨论】:

  • 第三个选项,不是我提倡它,但根据用例可能有必要:祖父母创建父母,父母创建孩子;父母有SIGTERM处理程序,在孩子自己死之前杀死它;祖父母在需要时杀死父母。每个进程只处理自己的直接子进程。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2014-10-01
相关资源
最近更新 更多