我正在尝试编写一个函数来生成一个子进程,让它运行一段时间,然后在它尚未完成时杀死它:
int sysExecTimeout(const char * exePath, int timeoutSec);
在函数中,我使用fork
and execl
生成孩子,并且当超时时,我使用kill(pid, SIGTERM)
and kill(pid, SIGKILL)
2秒后,确保孩子死亡:
pid_t pid = fork();
if(pid == 0) {
execl("/bin/sh", "sh", "-c", exePath);
exit(127);
} else if(pid != -1) {
// timeout code
if(timeout) {
kill(pid, SIGTERM);
sleep(2);
kill(pid, SIGKILL);
}
}
我使用的是Linux,似乎当父进程终止时,子进程不会自动终止。所以两人kill
调用只会杀死/bin/sh
处理并留下exePath
命令正在运行,因为它是/bin/sh
.
我正在尝试写sysExecTimeout
函数,它会杀死根目录为的整个进程树pid
, where pid
PID 是来自pid = fork()
我需要这个因为exePath
命令将生成其他命令,这些命令也可能生成其他命令,这些命令可能会卡住并消耗资源。
我无法控制exePath
被执行的二进制文件/脚本,所以我不能在其中编写我自己的“parent-dies-so-kill-the-children”逻辑。
我尝试使用kill(0, SIGTERM)
,这几乎完成了工作,但它也杀死了我自己的进程:)
我想知道是否有一个标志可以在 C 中以编程方式打开,上面写着“嘿,伙计,当我死后,带走我所有的孩子并杀死他们,并为他们的孩子递归重复”,以便整个进程树从该程序开始死(假设可以遵循 PID/PPID 链)。
我可以在这里使用该标志:
if(pid == 0) {
turnOnRecursiveDeathFlag();
system(exePath);
//execl("/bin/sh", "sh", "-c", exePath);
exit(127);
}
有没有办法做到这一点?我已经搜索了一段时间,但我所能找到的只是使用黑客ps -ef
,或修改您正在运行的子进程等。