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

时间:2014-04-16 00:03:00

标签: 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);
     }
     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个version.out's),并且“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版本没有超时,还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

你正在创建一个shell(孩子),它反过来运行" version.out" (孙子)。

你杀死了孩子,从而使它成为一个僵尸,孤儿孙子。您可以通过第二次致电wait来收集孩子(第一次出错,或者您永远不会打电话给kill),但您仍然无法实现杀死孩子的目标来自父母的孙子。