如何杀死父进程的子树

时间:2016-09-26 18:43:05

标签: c process

我创建了一个包含3个孩子的流程。问题是我无法在fork()==0结束时创建任何这些孩子而不会杀死它们。 我的代码就像:

for(i=0 ; i<3 ; i++){
  if(fork()==0){
    //do child things
    exit(0);
  }
  else{
    //do parent things
  }
}

我想在不杀死他们的情况下创建这3个孩子,并且在创建它们时将其全部杀死。

PS:对不起我的英语:)

2 个答案:

答案 0 :(得分:0)

您需要跟踪每个孩子的pid。然后在循环结束时,你kill

pid_t child_pid[3];
for(i=0 ; i<3 ; i++){
  child_pid[i] == fork();
  if (child_pid[i]==-1){
      perror("fork failed");
      exit(0);
  } else if (child_pid[i]==0){
    //do child things
    exit(0);
  }
  else{
    //do parent things
  }
}
for(i=0 ; i<3 ; i++){
    kill(child_pid[i], SIGKILL);
}    

答案 1 :(得分:0)

  

问题在于我无法在不杀死它们的情况下创建任何这些孩子

我在你的示例代码中看到的唯一可以与之关联的内容是&#34; kill&#34;孩子们打电话给exit()。我根本不会称之为&#34;杀死&#34;然而,他们;每个孩子在工作结束时执行exit()时都会正常终止。

此外,在这一点上,没有任何东西强迫你让孩子exit()。如果他们不退出,他们只是继续if块。如果你不希望他们分叉自己的孩子,那么你可以用break代替exit(),以便他们突破周围的循环。

这确实提出了这样做是否有意义的问题。除非实际上有一些适合孩子们在离开循环后执行的工作,否则让他们像现在一样打电话给exit()是正确的。

无论如何,如果你真的想要强行杀死子进程而不是让它们正常终止,那么@ dbush演示了如何做到这一点。但是,也许你希望父母在循环之后等待直到孩子们都自己终止。在这种情况下,您可以拨打kill(),而不是在@dbush演示时调用waitpid()。另请注意,如果你手动杀死孩子,那么你应该等待他们。只有当您希望孩子们能够独立继续跑步时才能等到他们。