我编写了一个重定向子进程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);
}
答案 0 :(得分:0)
很难说出你的描述和小代码块真正发生了什么。
但是,在execv
之前更改缓冲的尝试将不起作用,因为该过程将作为整体替换,包括libc stdio state。您需要在已执行的子进程中更改缓冲。
如果您不控制孩子,则可以使用stdbuf
执行该操作。