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