开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:无名管道的概念 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11025
无名管道的概念
内容介绍
一、管道概述
二、特点
三、总结
一、管道概述
管道 (pipe )又称无名管道。还有一种是命名管道。
无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。
特殊体现在文件当中是找不到的,因为他没有属于自己的文件名。操作文件的时候通过文件描述符,open 打开一个文件的时候得到一个描述符,通过文件描述符对文件进行读或者写。
无名管道没有名字,在程序当中去创建无名管道,就能得到两个文件描述符,通过文件描述符对文件进行读或者写。
假如说两个进程,中间有一个管道,1进程可以往管道里写东西,2进程可以从管道读东西。
管道有两个文件描述符,一个是为了写而打开的,另外一个是为读而打开的。
二、特点
管道是最古老的 UNIXIPC 方式,
其特点是:
1、半双工,数据在同一时刻只能在一个方向上流动。
举例
有两个进程但只有一个管道,这两个进程要通过管道传输数据
如果两个数据都通往管道,那他的数据就乱了。
应该是一个进程写进去,一个进程读出去
传输数据之后再从另一个方向传输进程
扩展一下单工,全双工
单工通信:
消息的传送是单项的。例如生活使用的收音机,只能接收消息,例如GPS导航只能接收卫星数据,是不能给卫星发送数据的。
半双工通信:
例如对讲机,发送消息的时候没办法收到,收到消息的时候没有办法发送同步消息。
全双工通信:
例如手机,打电话的时候听着对方生音还可以通话,发送消息的同时还可以接收消息。
2、数据只能从管道的一端写入,从另一端读出。
3、写入管道中的数据遵循先入先出的规则。
例如在管道里面放球体,先放进去的必然先出来
4、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,例如数据的发送方和接收方规定好,一次性发送一百个字节,对方接收一百个字节,而且这一百个字节,每一个的意义都是双方自行约定的,如多少字节算一条消息等。
5、管道是文件,但不是普通的文件,不属于某个文件系统,其只存在于内存中。比如在硬盘上是看不到这个文件的,因为这个管道没有名字。
6、管道在内存中对应一个缓冲区。因为它存在于内存,我们在管道里面写数据,存放在缓冲区里面,不同的系统其大小容量不一定相同。
7、从管道读数据是一次性操作,数据一但被读走,它就从管道中被抛弃,释放空间以便写更多的数据。
这是进程通信必须的,不然会乱。也就是说这个进程写了helword,被下一个进程读出去了,就相当于被管道抛弃了。
8、管道没有名字,只能在具有公共祖先的进程之间使用。不相关的进程,他的地址是独立的。不相关的进程是没有两个图片描述符的,所以他就没办法去操作管道。
所以要想使用无名管道进行通信,在这个进程当中去创建一个管道,得到了两个文件描述符,然后这个进程去fork,用fork创建一个进程,得到了一个子进程,子进程可以继承了父进程,然后子进程就可以通过fd1往管道里面写数据,通过fd0去读数据,所以要想使用无名管道进程间通信,前提是这些进程都拥有管道的描述符。
所以,使用无名管道进行通信的进程必须是父进程和子进程,或者是父进程和分进程等等拥有管道描述符这些进程之间进行通信。
因为管道是个特殊文件,不能通过open+路径的方式来找到管道的只能把文件的管道符继承下去。
三、总结
管道是一个特殊的文件,存在于内存当中,无名管道没有名字,只能在父子进程之间进行通信,创建管道的时候得到两个文件描述符,为读而打开的,为写而打开的文件描述符。
管道还具有先进先出的特点,先写的数据会被先读出来,数据一旦被读出来,从管道当中就被抛弃了,属于半双工通信。




