匿名管道的 ReadFile 函数

Posted

技术标签:

【中文标题】匿名管道的 ReadFile 函数【英文标题】:ReadFile function for an anonymous pipe 【发布时间】:2013-04-17 21:18:56 【问题描述】:

我有一个关于 Windows 管道的问题。在ReadFile功能手册中写着:

如果正在使用匿名管道并且写入句柄已关闭,则当 ReadFile 尝试使用管道对应的读取句柄进行读取时,函数返回 FALSE,GetLastError 返回 ERROR_BROKEN_PIPE。

让我们假设从管道中读取每秒发生一次。从上次读取操作开始,发生了以下情况:写入管道操作和关闭写入处理程序。根据上面的手册,该函数返回false - 读取操作失败。我的问题是未读取的数据会发生什么?我怎样才能得到它们?

【问题讨论】:

【参考方案1】:

如你所料,数据放入管道后,你可以将其读出,直到到达数据的末尾,然后读取将失败。

【讨论】:

所以,当ReadFile 返回false 时出现ERROR_BROKEN_PIPE 错误。这并不意味着函数失败了,这意味着它完成了它的工作(从管道中读取最后的数据)? @user14416:是的——如果你(例如)产生一个写一些输出然后退出的孩子,那么你应该读取数据然后得到 ERROR_BROKEN_PIPE。当然,它可能也意味着孩子坠毁,或类似的事情。 相信调用ReadFile从管道中获取最后一条数据会成功,下一次调用会返回ERROR_BROKEN_PIPE。换句话说,错误被推迟到管道为空。

以上是关于匿名管道的 ReadFile 函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中创建匿名管道

匿名管道上的重叠 I/O

Win32 匿名管道在第一次读取后损坏

Linux_Centos进程间通信_管道(匿名管道_命名管道)

linux中有名管道与匿名管道的实现

linux中有名管道与匿名管道的实现