繁体   English   中英

无法使用 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. 重构您的逻辑,以便两个子进程都由父进程创建,因此它单独将其进程 ID 放入其kids向量中。

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

最简单的选择是第一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM