我有以下代码在子进程中执行二进制文件,等待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版本没有超时,还有其他选择吗?
答案 0 :(得分:2)
你正在创建一个shell(孩子),它反过来运行" version.out" (孙子)。
你杀死了孩子,从而使它成为一个僵尸,孤儿孙子。您可以通过第二次致电wait
来收集孩子(第一次出错,或者您永远不会打电话给kill
),但您仍然无法实现杀死孩子的目标来自父母的孙子。