fprintf vs WriteFile 写入管道:无法从所有管道读取

Posted

技术标签:

【中文标题】fprintf vs WriteFile 写入管道:无法从所有管道读取【英文标题】:fprintf vs WriteFile to write to pipe: Cannot read from all pipes 【发布时间】:2013-08-29 20:05:38 【问题描述】:

我正在尝试运行一个控制台应用程序并读/写它的标准 i/o。问题是,当这个应用程序通过 WriteFile(GetStdHandle(...)) 写入输出时,我通过管道上的 ReadFile 成功读取了它的输入。

当目标应用程序使用 fprintf 时,ReadFile 会阻塞,直到目标应用程序退出,在这种情况下,它会立即返回整个输出。当目标应用程序阻塞时(例如,通过 fgets()),ReadFile 阻塞。

我正在使用标准管道重定向:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx。

为什么会出现这种奇怪的行为,我该如何解决?

【问题讨论】:

复制***.com/questions/1716296/… 【参考方案1】:

这可能是因为 fprintf 被缓冲而 WriteFile 没有被缓冲。你可以在 fprintf 之后使用 fflush 并尝试相同的方法吗?

【讨论】:

我可以,但是不使用 fflush 的应用程序呢?我该如何处理? 在这种情况下什么也做不了。事实上,你不能保证单独的应用程序(没有管道)会打印任何东西,直到它退出。因此,行为与重定向到管道或打印到标准输出没有太大区别。

以上是关于fprintf vs WriteFile 写入管道:无法从所有管道读取的主要内容,如果未能解决你的问题,请参考以下文章

如何在管道上使用 WriteFile 修复乱码文本?

命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA

使用 ReadFile 和 WriteFile 时出现死锁

如何确保已读取所有管道缓冲区?

在 Windows 中创建匿名管道

nodejs模块——fs模块 WriteFile写入文件