1

我编写了一个重定向子进程 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);
}
4

1 回答 1

0

从您的描述和小代码块中很难说出真正发生了什么。

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

如果你不控制孩子,那么你可以用stdbuf.

于 2013-05-24T08:29:51.477 回答