c - 为子进程重定向 IO

标签 c linux stdio io-redirection

我编写了一个重定向子进程 IO 的程序。我遇到的问题是新的 stdout 和 stderr 没有直接写入文件,而是在内存中缓冲。我尝试使用 setvbuf 解决此问题,但没有成功。

我在函数返回时没有遇到任何错误。

这非常令人沮丧,因为我在以前的实现中删除了缓冲,但我以某种方式丢失了文件。无论如何,我不确定为什么 setvbuf 不能解决我的问题。

if (!freopen(DBGD_CHILD_STDOUT, "w", stdout)){
    perror ("Couldn't open new child-stdout");
    exit (-1);
}

if (!freopen(DBGD_CHILD_STDERR, "w", stderr)){
    perror ("Couldn't open new parent-stderr");
    exit (-1);
}

if (setvbuf (stdout, 0, _IONBF, 0)){
    perror ("Couldn't change buffering mode of stdout");
    exit (-1);
}

if (setvbuf (stderr, 0, _IONBF, 0)){
    perror ("Couldn't change buffering mode of stderr");
    exit (-1);
}

if (execv (ProcessArgs[0], &ProcessArgs[1]) < 0){
    perror ("Couldn't execute process");
    exit (-1);
}

最佳答案

很难从你的描述和小代码块中判断到底发生了什么。

但是,在 execv 之前更改缓冲的尝试不会有任何效果,因为进程将作为一个整体被替换,包括 libc stdio 状态。您需要改为更改已执行子进程中的缓冲。

如果你不控制 child ,那么你可以用stdbuf来执行它.

关于c - 为子进程重定向 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16730456/

相关文章:

c - sizeof 运算符与可变长度数组一起作为函数参数

c - 在 Sublime Text 3 上用 C 语言构建 Portaudio

用字符指针创建表

linux - 写入任何地方的用户空间程序

c++ - std::getline 混合输入行结尾时的替代方法

gcc - fatal error : _stdio. h:没有那个文件或目录

c - 缓冲 io 使用 stdio.h 异步吗?

c - MSVCRT:sin、cos等的实现(源码)在哪里?

c++ - 安装了两个 OpenCV(不同版本),我无法删除过去一个的所有痕迹

regex - Linux 正则表达式 - 在行首使用 OR 运算符