我正在尝试编写一个函数,它会生成一个子进程,让其运行一段时间,如果在规定时间内未完成,则强制终止该进程:
在这个函数中,我使用
我正在使用Linux,似乎当父进程死亡时,子进程不会自动终止。因此,这两个“kill”调用将仅杀死“/bin/sh”进程,并使“exePath”命令继续运行,因为它是“/bin/sh”的子进程。
我正在尝试编写“sysExecTimeout”函数,以便它可以杀死以“pid”为根的整个进程树,“pid”是从“pid = fork()”获得的PID。
我需要这样做是因为“exePath”命令将生成其他命令,这些命令也可以生成其他命令,这些命令可能会卡住并消耗资源。
我无法控制执行的“exePath”二进制文件/脚本,因此我不能在其中编写自己的父进程死亡所以杀死子进程的逻辑。
我尝试使用“kill(0,SIGTERM)”,它几乎完成了任务,但它还杀死了我的进程:)
我想知道是否有一个标志我可以在C中以编程方式打开,它说“嘿,当我死亡时,带上所有我的孩子并杀死他们,并针对他们的孩子递归重复” ,以便从该程序开始的整个进程树都会死亡(假设可以跟踪PID / PPID链)。
我可以在这里使用该标志:
int sysExecTimeout(const char * exePath, int timeoutSec);
在这个函数中,我使用
fork
和execl
来生成子进程,并在超时后使用kill(pid, SIGTERM)
和kill(pid, SIGKILL)
在两秒钟内确保子进程死亡。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”为根的整个进程树,“pid”是从“pid = fork()”获得的PID。
我需要这样做是因为“exePath”命令将生成其他命令,这些命令也可以生成其他命令,这些命令可能会卡住并消耗资源。
我无法控制执行的“exePath”二进制文件/脚本,因此我不能在其中编写自己的父进程死亡所以杀死子进程的逻辑。
我尝试使用“kill(0,SIGTERM)”,它几乎完成了任务,但它还杀死了我的进程:)
我想知道是否有一个标志我可以在C中以编程方式打开,它说“嘿,当我死亡时,带上所有我的孩子并杀死他们,并针对他们的孩子递归重复” ,以便从该程序开始的整个进程树都会死亡(假设可以跟踪PID / PPID链)。
我可以在这里使用该标志:
if(pid == 0) {
turnOnRecursiveDeathFlag();
system(exePath);
//execl("/bin/sh", "sh", "-c", exePath);
exit(127);
}
有没有方法可以做到这一点?我已经搜索了一段时间,但我能找到的都是使用 ps -ef
或修改正在运行的子进程等技巧。
fork()
出现问题,而不是子进程。 - xtof pernod