gpt4 book ai didi

c++ - 是否可以使用 C 中的系统 api 启动终止命令?如果没有其他选择?

转载 作者:行者123 更新时间:2023-12-02 07:36:06 25 4
gpt4 key购买 nike

我正在使用系统 api 启动命令(我可以将此 api 与 C/C++ 一起使用)。我传递的命令有时可能会挂起,因此我想在一定的超时后终止。

目前我将其用作:

system("COMMAND");

我想像这样使用它:

使用系统独立的 API 运行命令(我不想使用 CreateProcess,因为它仅适用于 Windows)如果进程在“X”分钟后没有退出,则终止该进程。

最佳答案

由于 system() 是特定于平台的调用,因此不可能有独立于平台的方法来解决您的问题。但是,system() 是一个 POSIX 调用,因此如果任何给定平台都支持它,则 POSIX API 的其余部分也应该如此。因此,解决问题的一种方法是使用 fork()kill()

有一个复杂之处,system()调用一个shell,它可能会产生其他进程,我猜你想杀死所有这些进程,所以一种方法是使用一个进程组。基本思想是使用 fork() 创建另一个进程,将其放入自己的进程组中,如果该进程在一定时间后没有退出,则终止该进程。

一个简单的例子——程序 fork ;子进程将自己的进程组设置为与其进程ID相同,并使用system()产生无限循环。父进程等待 10 秒,然后使用子进程 PID 的负值杀死进程组。这将杀死 fork 进程以及该进程的任何子进程(除非它们更改了进程组。)

由于父进程位于不同的组中,因此 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);
}

关于c++ - 是否可以使用 C 中的系统 api 启动终止命令?如果没有其他选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com