Ali*_*scu 4 c linux tree kill process
我正在尝试编写一个生成子进程的函数,让它运行一段时间然后如果它还没有完成就杀死它:
int sysExecTimeout(const char * exePath, int timeoutSec);
Run Code Online (Sandbox Code Playgroud)
在功能方面,我使用fork并execl产卵的孩子,而且,当它超时,我用kill(pid, SIGTERM)和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);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Linux,似乎当父进程终止时,子进程不会自动被杀死.所以这两个kill调用只会终止/bin/sh进程并让exePath命令继续运行,因为它是一个子进程/bin/sh.
我正在尝试编写sysExecTimeout函数,以便它杀死整个进程树pid,其中pidPID来自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);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我一直在寻找,但我能找到的只是黑客使用ps -ef或修改你正在运行的子进程等.
Dox*_*ver 11
在子节点中使用setpgid将其GPID设置为等于其自己的PID.然后父母可以杀死(-pid,...)以发信号通知整个组.
pid_t pid = fork();
if(pid == 0) {
setpgid(0, 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);
}
}
Run Code Online (Sandbox Code Playgroud)
应该这样做.
还有一件事,当你产生一个shell时,确保它不启用作业控制.否则,它将创建自己的进程组.你的"/ bin/sh -c"很好.
| 归档时间: |
|
| 查看次数: |
19134 次 |
| 最近记录: |