我正在使用系统 api 启动一个命令(我可以将这个 api 与C/C++一起使用)。我传递的命令有时可能会挂起,因此我想在特定超时后终止。
目前我将它用作:
system("COMMAND");
Run Code Online (Sandbox Code Playgroud)
我想像这样使用它:
使用独立于系统的 API 运行命令(我不想使用 CreateProcess,因为它仅适用于 Windows)如果它在“X”分钟后没有退出,则终止该进程。
由于system()是特定于平台的调用,因此不可能有独立于平台的方法来解决您的问题。然而,system()这是一个 POSIX 调用,因此如果任何给定平台都支持它,则 POSIX API 的其余部分也应该如此。因此,解决问题的一种方法是使用fork()和kill()。
调用 shell会很复杂system(),它可能会生成其他进程,我认为您想杀死所有进程,因此一种方法是使用进程组。基本思想是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);
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*sta -3
我不知道用 C 或 C++ 语言有什么可移植的方法来做到这一点。当您要求替代方案时,我知道用其他语言也是可能的。例如,在 Python 中,可以使用该subprocess模块。
import subprocess
cmd = subprocess.Popen("COMMAND", shell = True)
Run Code Online (Sandbox Code Playgroud)
然后您可以测试 COMMAND 是否已结束
if cmd.poll() is not None:
# cmd has finished
Run Code Online (Sandbox Code Playgroud)
你可以用以下命令杀死它:
cmd.terminate()
Run Code Online (Sandbox Code Playgroud)
即使您更喜欢使用 C 语言,您也应该阅读subprocess 模块的文档,因为它解释了它内部CreateProcess在 Windows 和os.execvpPosix 系统上使用来启动命令,并TerminateProcess在 Windows 和SIG_TERMPosix 上使用来停止命令。
| 归档时间: |
|
| 查看次数: |
4151 次 |
| 最近记录: |