gpt4 book ai didi

c - 标准错误和 popen() : how to do it?

转载 作者:太空宇宙 更新时间:2023-11-04 05:31:33 24 4
gpt4 key购买 nike

我想从 C 代码打开一个进程,并能够读取它的标准输出和标准错误,同时能够写入它的标准输入。

我最接近的方法是使用 popen(),但这不允许您读取标准错误流。您可以在命令中添加“2>&1”,但这将无法区分标准输出和错误数据。我的应用程序需要能够分离两个流。

Python 有 popen3 和 Ruby 有 Open3 来做这些事情,但我似乎找不到用 C 做的方法。有什么帮助吗?

最佳答案

#include <unistd.h>
#include <stdio.h>

...


int pipe_err[2], pipe_out[2], pipe_in[2];

if (pipe(pipe_err) || pipe(pipe_out) || pipe(pipe_in)) { // abbreviated error detection
perror("pipe");
scream_and_run_around_frantically();
exit(BAD);
}
pid_t pid = fork();
if (!pid) { // in child
dup2(pipe_err[1], 2);
dup2(pipe_out[1], 1);
dup2(pipe_in[0], 0);
close(pipe_err[0]);
close(pipe_err[1]);
close(pipe_out[0]);
close(pipe_out[1]);
close(pipe_in[0]);
close(pipe_in[1]);

// close any other files that you don't want the new program
// to get access to here unless you know that they have the
// O_CLOEXE bit set

execl(program_path, program_name, arg1, arg2, arg3);
/* only gets here if there is an error executing the program */
} else { // in the parent
if (pid < 0) {
perror("fork");
error_death_plague_stubbed_toe();
exit(BAD);
}
child_err = pipe_err[0];
close(pipe_err[1]);
child_out = pipe_out[0];
close(pipe_out[1]);
child_in = pipe_in[1];
close(pipe_in[0]);

...

你可能想看看

man 3 exec

它有很多功能可以将当前程序转换为新程序。它们都有不同的接口(interface),但在底层使用 execve

man 2 execve

还有:

man 2 fork

man 2 pipe

关于c - 标准错误和 popen() : how to do it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3934118/

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