gpt4 book ai didi

c - 杀死以 popen 启动的进程

转载 作者:太空狗 更新时间:2023-10-29 16:25:49 24 4
gpt4 key购买 nike

在使用popen 打开一个进程的管道后,有没有办法杀死已经启动的进程? (使用 pclose 不是我想要的,因为它会等待进程完成,但我需要终止它。)

最佳答案

不要使用 popen(),编写您自己的包装器来执行您想要的操作。

fork() 相当简单,然后替换stdin & stdout通过使用 dup2(),然后对您的 child 调用 exec()

这样,您的 parent 将拥有确切的 child PID,您可以使用kill() 就可以了。

Google 搜索“popen2() implementation”以获得一些示例代码如何实现 popen() 正在做什么。只有十几行长。取自dzone.com我们可以看到一个看起来像这样的例子:

#define READ 0
#define WRITE 1

pid_t
popen2(const char *command, int *infp, int *outfp)
{
int p_stdin[2], p_stdout[2];
pid_t pid;

if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
return -1;

pid = fork();

if (pid < 0)
return pid;
else if (pid == 0)
{
close(p_stdin[WRITE]);
dup2(p_stdin[READ], READ);
close(p_stdout[READ]);
dup2(p_stdout[WRITE], WRITE);

execl("/bin/sh", "sh", "-c", command, NULL);
perror("execl");
exit(1);
}

if (infp == NULL)
close(p_stdin[WRITE]);
else
*infp = p_stdin[WRITE];

if (outfp == NULL)
close(p_stdout[READ]);
else
*outfp = p_stdout[READ];

return pid;
}

注意:似乎 popen2() 是您想要的,但我的发行版似乎没有这种方法。

关于c - 杀死以 popen 启动的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/548063/

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