下面是函数的代码:
int getStream()
{
int fd = _dup(fileno(stdout));
freopen("tmp","w",stdout);
return fd;
}
void freeStream(int fd)
{
_dup2(fd,fileno(stdout));
close(fd);
}
主程序代码:
printf(“start tets”);
int fd = getStream();
printf(“redirection”);
freeStream(fd);
这是一个使用llvm的大程序的一部分在freeStream(fd)
和LLVM ERROR: IO failure on output stream.
之后的问题我理解问题在于freeream的执行。你觉得呢?由于
如果您想可靠地看到文本"redirection"
结束在您的临时文件中,您需要在关闭stdout
缓冲区之前刷新它,以摆脱流中缓冲的任何挂起的写操作。要做到这一点,将这一行添加到freeStream
函数中:
void freeStream(int fd)
{
fflush(stdout); //<== add this line
_dup2(fd,fileno(stdout));
close(fd);
}
正如Jason所诊断的那样,在关闭底层文件(通过_dup2()
调用)之前,您需要对流(stdout
)进行fflush()
。
另一个问题是代码中没有错误检查;您不知道哪个(如果有的话)函数调用失败了。至少在解决此问题时,您需要同时监视freopen()
和_dup2()
,以确保它们正常工作。
目前还不清楚,在Windows上,您可以到达<stdio.h>
库的后面并更改文件描述符。在Unix上,我认为它可能会工作-不一定支持,但可能会工作。但我可以很容易地想象它在Windows上失败的方式(我不确定我的想象力是不是太生动了)。
最终,我不相信有一种可移植的方法可以在使用freopen()
后将stdout
恢复到原始输出。