C++ 在C++;,fork和kill不杀死所有子进程
我有下面的代码,它在子进程中执行一个二进制文件,等待1秒,如果没有完成,就杀死它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); }
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。