C++ 在C++;,fork和kill不杀死所有子进程

C++ 在C++;,fork和kill不杀死所有子进程,c++,linux,fork,kill,busybox,C++,Linux,Fork,Kill,Busybox,我有下面的代码,它在子进程中执行一个二进制文件,等待1秒,如果没有完成,就杀死它 pid_t pid; pid=fork(); if (pid == 0) { //In child execl("/bin/sh", "sh", "-c", "/opt/qcom/bin/version.out > /tmp/version", (char *)NULL); exit(0); }

我有下面的代码,它在子进程中执行一个二进制文件,等待1秒,如果没有完成,就杀死它

     pid_t pid;
     pid=fork();
     if (pid == 0)
     {
         //In child
         execl("/bin/sh", "sh", "-c", "/opt/qcom/bin/version.out > /tmp/version", (char *)NULL);
         exit(0);
     }
     else
     {
         // In parent, wait for 1 second
         sleep(1);
         int status;
         if (waitpid(pid, &status, WNOHANG) != pid)
         {
             //kill(pid, SIGTERM); //--> tried this too
             kill(pid, SIGKILL);
         }
         fsmverDir("/tmp/version");
         system("rm /tmp/version");
     }
但它并没有完全杀戮,在运行我的程序3次后,我看到下面的ps输出(它创建了3个版本的.out),并且“sh”显示为僵尸

# ps | grep "version.out\|sh"
2012 root         0 Z    [sh]
2013 root     13236 S    /opt/qcom/bin/version.out
2058 root         0 Z    [sh]
2059 root     13236 S    /opt/qcom/bin/version.out
2092 root         0 Z    [sh]
2093 root     13236 S    /opt/qcom/bin/version.out
2100 root      2360 S    grep version.out\|sh
# 
或者,有没有办法在busybox Linux中运行超时命令?
比如:

execlp("timeout","timeout","1","sh","-c","/opt/qcom/bin/version.out > /tmp/version",NULL);
在我的busybox版本中没有超时,有其他选择吗?

您正在创建一个shell(子脚本),该shell依次运行“version.out”(孙子脚本)


你杀死了这个孩子,让它变成了僵尸,让孙子成为孤儿。您可以通过第二次调用
wait
来收集孩子(第一次调用时出错,否则您将永远不会调用
kill
),但您仍然无法实现从家长处杀死孙子的目标。

您需要再次等待,在kill()之后,第一次调用wait并没有导致任何子项再次被清理干净?@navaneeth yes。除非父母做了WaITPIDID(),否则孩子不能在父母的生活中被清理。最好把产卵过程考虑成没有外壳。这样您就不必等待两次或终止两个进程;在现有waitpid之前和之后各有一个,但都没有帮助,即使我从execl命令中删除了“/bin/sh”并使用了dup2(),也没有帮助,我将“version.out”视为僵尸,而不是[sh]之前,仅供参考,我使用的是busybox版本,而不是完整的Linux。