微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免closures后从命名pipe道阻塞read

我有两个使用命名pipe道创build的进程。 编写器进程使用write()写入消息,读取器进程使用read()读取消息。 我注意到,当编写器closurespipe道时,read()会被阻塞。 在closurespipe道之前,是否可以让编写器进程发送EOF,以便读者不会被阻塞?

如何更改解释器path并将命令行parameter passing给Linux上的“可执行”共享库?

如果内核支持IPv6,如何从用户空间进行testing?

终止Qt过程:什么是Windows任务pipe理器在做什么,我不是?

如何获取应用程序到扩展映射

ungetc:推回的字节数

不…发送EOF是不可能的,因为EOF不是映射到通道上发送的东西。 EOF条件(是的,这是一个条件,而不是通过频道接收或发送的)意味着没有更多的数据可以read(2)并且通过使read(2)返回0个字符读取来获得。 在EOF条件下读取的内容很多,它们将返回0值,这意味着没有更多的数据。

顺便说一下,当没有数据可用时,管道阻塞读取器,但是由于作者仍然在那里发送更多数据,所以没有EOF条件。 通过设计,管道在没有数据可用的情况下阻塞读取器(但是作者仍然打开管道),并在没有更多空间将数据放入FIFO中时阻止写入器(这发生在有读写器打开FIFO但没有他们正在阅读)当你看到这是一个功能,而不是一个错误

如果你想让read(2)不被阻塞,并且在没有数据的时候得到0 ,你可以用O_NONBLOCK标志open(2) (或者稍后用fcntl(2)系统调用)来open(2) read(2)立即返回可用的数据(即使没有可用的数据),但它有一个缺点:那么你不能从一个实际的EOF区分一个没有可用的数据(它没有被写入)的fifo(作者已经关闭了它因为两者都会以0返回。

顺便说一下,在讨论文件结束条件时,我不喜欢使用EOF常量,因为它增加了定义的混乱。 EOF是getchar(3)在文件条件结束时返回的值,但它不是char (如果检查getchar(3)的定义,将发现它定义为int而不是char ,这将添加EOF条件可能的char值的整个范围—所以,从getchar(3)返回257个可能的值,数据0-256和文件结束条件的 EOF )

如果你想让作家发信号结束,他们必须close(2) fifo并重新打开它。

当作者关闭管道时,读卡器不会阻塞,即使它被阻塞(例如它会被唤醒)。 读取调用将返回0,指示管道上的EOF。 读者应该这样做:

rlen = read(pipefd,buf,sizeof(buf)); if (rlen <= 0) break;

你正在检查你的返回码吗?

在作者中,如果读者过早地关闭了管道(比如中止),那么作者将从写入-1返回,并将errno设置为EPIPE。 它也可以得到SIGPIPE。

见男子7管…

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐