【问题标题】:streams and llvm error流和 llvm 错误
【发布时间】:2011-12-08 18:08:54
【问题描述】:

这里是函数的代码:

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. 我知道问题出在 freeStream 实现上。 你怎么看? 谢谢

【问题讨论】:

    标签: c visual-studio stream llvm


    【解决方案1】:

    如果您想可靠地看到文本 "redirection" 最终出现在临时文件中,则需要在关闭 stdout 之前刷新缓冲区,以消除流中缓冲的任何待处理写入.为此,请将此行添加到您的 freeStream 函数中:

    void freeStream(int fd)
    {
       fflush(stdout); //<== add this line
       _dup2(fd,fileno(stdout));
       close(fd);
    }
    

    【讨论】:

      【解决方案2】:

      正如 Jason 诊断的那样,在关闭基础文件(通过 _dup2() 调用)之前,您需要 fflush() 流 (stdout)。

      另一个问题是代码中没有错误检查;您不知道您的函数调用中的哪个(如果有)失败了。至少在解决此问题时,您需要同时监控 freopen()_dup2() 以确保它们正常工作。

      尚不清楚在 Windows 上,您可以到达 &lt;stdio.h&gt; 库的后面并更改文件描述符。在 Unix 上,我认为它可能会起作用 - 不一定支持,但可能会起作用。但我可以很容易地想象它在 Windows 上失败的方式(不确定我的想象力不仅仅是生动)。

      最终,我不相信在使用freopen() 后,有一种可移植的方式可以将stdout 恢复到其原始输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多