如何避免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管…

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....