C语言 streams and llvm error



下面是函数的代码:

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恢复到原始输出。

相关内容

  • 没有找到相关文章

最新更新