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

2024-02-27

我正在使用系统 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(使用前将#替换为@)

是否可以使用 C 中的系统 api 启动终止命令?如果没有其他选择? 的相关文章

随机推荐