代码之家  ›  专栏  ›  技术社区  ›  Osama Naeem

无法使用SIGTERM杀死所有子进程

  •  0
  • Osama Naeem  · 技术社区  · 4 年前

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

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

    1 回复  |  直到 4 年前
        1
  •  3
  •   Sam Varshavchik    4 年前
    std::vector<pid_t> kids;
    pid_t forkid = fork();
    

    fork() 创建 完整的重复图像 的子进程。重点在于: 复制 .

    这意味着,例如,子进程具有 非常自己 kids 向量,与父进程的原始进程无关 孩子们 矢量。

    因为这是第一件发生在 main ,这实际上与您两次运行此可执行文件没有什么不同,分别作为两个不同且独立的进程,而不是 fork 结束一个过程。你不能期待 孩子们 向量在两个过程中的一个过程中对 孩子们 矢量在另一个。

    第一个子进程创建第二个子进程,并将第二个子过程的pid添加到自己的进程中 孩子们 矢量。但这只是第一个子过程 孩子们 矢量。

    原始父进程的唯一进程id 孩子们 向量最终拥有的是第一个孩子的过程,所以这就是你所能得到的 SIGTERM .

    您的选择是:

    1. 重新构建您的逻辑,以便 二者都 子进程由父进程创建,因此它单独将其进程ID放入 孩子们 矢量。

    2. 而不是使用 使用多个执行线程和同一进程。然而,两者都没有 std::vector ,也没有任何其他C++库容器是线程安全的。需要编写大量的代码来正确地同步线程,以便事情能够正确地自行处理(更不用说 SIGTERM ,对于多个执行线程,需要以某种方式进行发明)。

    最简单的选择是第一种。