无法使用 SIGTERM 终止所有子进程

Can't kill all child processes using SIGTERM

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

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。 我在这里做错了什么。任何帮助将不胜感激。谢谢

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

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

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

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

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

原始父进程的 kids 向量最终拥有的唯一进程 ID 是它的第一个子进程,所以这就是您得到的 SIGTERM

您的选择是:

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

  2. 而不是使用 fork 使用多个执行线程和相同的进程。但是,std::vector 和任何其他 C++ 库容器都不是线程安全的。需要编写大量代码来正确地同步线程,以便事情能够正确地自行解决(更不用说 SIGTERM 的模拟,关于多个执行线程,需要以某种方式发明)。

最简单的选择是第一个。