2.1 管道的原理
在进程的内核空间中,创建一个管道文件,管道中的数据直接保存在内存中。
2.2 管道的特性
- 管道可以看成是一个特殊的文件,普通的文件数据存储在外存上,但是管道文件中的内容存储在内存中。
- 掉电擦除,
- 管道的读写端均关闭后,管道中的数据会被释放。
- 管道遵循先进先出的原则,队列的方式实现。
- 对于管道的读操作是一次性的,如果对管道进行读操作,被读取的数据会被从管道中删除。
- 管道是一种半双工通信方式。
- 单工:只能A发消息给B,
- 半双工:同一时间,只能A发消息给B或者B发消息给A
- 全双工:同一时间,AB能够互相发消息。
- 对于管道的操作,只能使用文件IO函数,不能使用标准IO函数,因为需要直接操作内核空间。且不能使用lseek函数。
- 管道的大小:65536byte = 64k
- 从管道中读取数据
- 管道的写端存在
- 当管道中没有数据的时候,read函数会阻塞;
- 当管道中有10个数据,只读取5个,问实际读取5个
- 当管道中有5个数据,读取10个,问实际读取5个。
- 管道的写端不存在(父子进程均关闭写端)
- 若管道中还有数据,则先将所有数据读取完毕、
- 数据读取完毕后,read函数不会阻塞,且立即返回0.
- 管道的写端存在
- 向管道中写入数据
- 管道的读端存在
- 当管道写满后,write函数会阻塞。
- 管道的读端不存在(父子进程均关闭读端)
- 当读端不存在,进程只要调用write函数,写入数据会造成管道破裂,该进程会收到SIGPIPE信号。
- SIGPIPE信号(管道破裂信号)会导致进程退出。
2.3 无名管道(pipe)
1)无名管道的特点
- 顾名思义,没有名字的管道文件,即在文件系统中不可见的管道文件。所以无法用open函数打开。
- 无名管道只能用于具有 亲缘 关系的进程间通信。
- 若想要实现进程间通信,则进程间需要操作同一根管道
- 但是无名管道在文件系统中不可见,所以无亲缘关系的进程无法拿到同一根管道的读写端。
- 而子进程会拷贝父进程的用户空间,包括文件描述符表,所以父子进程之间可以拿到同一根管道的读写端。
- 管道的读端存在