管道通信
Linux系统提供了一种通信方式,名字叫做管道通信,顾名思义,管道是单向的,比如水管、燃气管道等,换个说法就是管道是采用半双工通信的,也就是同一时刻只能完成发送数据或者接收数据。
匿名管道
匿名管道的特点是没有名称,所以用户无法使用open来创建和打开,但是匿名管道进行数据读写的方式和普通文件一样,都是支持read()/write()操作的。
匿名管道的创建
其中pipefd参数是一个数组类型,用于存储堆管道进行读写的文件描述符,pipefd[0]记录管道读取端的文件描述符,pipeifd[1]记录管道写入端的文件描述符
匿名管道的读写
对pipefd[0],pipefd[1]分别进行read与write的操作
有名管道
有名管道有文件名,可以被open,同样也支持read/write访问。
有名管道的创建
第一个参数是*const char *pathname,是创建的有名管道的文件路径
第二个参数是mode_t mode,是创建的有名管道的权限
有名管道的读写
open打开指定的有名管道后对其文件描述符进行read与write操作
管道读取数据的四种情况
总结:
如果一个管道的写端一直在写,而读端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只写不读再次调用write会导致管道堵塞;
如果一个管道的读端一直在读,而写端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只读不写再次调用read会导致管道堵塞;
而当他们的引用计数等于0时,只写不读会导致写端的进程收到一个SIGPIPE信号,导致进程终止,只写不读会导致read返回0,就像读到⽂件末尾⼀样。
思考:当一个管道写入10字节数据后,读取5字节数据,关闭管道再次打开,此时读取管道能否得到数据?
答:并不能读取到数据,进程阻塞直到写端有数据写入。因为管道通信是临时的内核缓冲区而不是持久化存储的通信方式,当其两个端口均关闭后,内容物会丢失。因此管道关闭后再打开是无法读取到之前尚未读取完毕的数据的。
管道间四种通信情况转载自:https://blog.csdn.net/skyroben/article/details/71513385
标签:读取,read,编程,通信,write,管道,有名 From: https://www.cnblogs.com/eon4051/p/18226750