我正在使用系统 api 启动命令(我可以使用此 apiC/C++)。我传递的命令有时可能会挂起,因此我想在一定的超时后终止。
目前我将其用作:
system("COMMAND");
我想像这样使用它:
使用独立于系统的 API 运行命令(我不想使用 CreateProcess,因为它仅适用于 Windows) 如果进程在“X”分钟后未退出,则终止该进程。
Since system()
是特定于平台的调用,不可能有独立于平台的方法来解决您的问题。然而,system()
是一个 POSIX 调用,因此如果任何给定平台都支持它,则 POSIX API 的其余部分也应该如此。所以,解决你的问题的一种方法是使用fork()
and kill()
.
这有一个复杂之处system()
调用一个 shell,它可能会生成其他进程,我认为您想要杀死所有这些进程,因此一种方法是使用进程组。基本思想是使用fork()
创建另一个进程,将其放入自己的进程组中,如果该进程在一定时间后没有退出,则终止该进程。
一个简单的例子——程序分叉;子进程设置自己的进程组与其进程ID相同,并使用system()
产生无限循环。父进程等待 10 秒,然后使用子进程 PID 的负值杀死进程组。这将杀死分叉进程以及该进程的任何子进程(除非它们更改了进程组。)
由于父进程位于不同的组中,kill()
对其没有影响。
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
int main() {
pid_t pid;
pid = fork();
if(pid == 0) { // child process
setpgid(getpid(), getpid());
system("while true ; do echo xx ; sleep 5; done");
} else { // parent process
sleep(10);
printf("Sleep returned\n");
kill(-pid, SIGKILL);
printf("killed process group %d\n", pid);
}
exit(0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)