管道
一. 管道
管道:一个进程来凝结到另一个进程的一个数据流称为一个”管道”。
管道实际上就是一个固定大小的缓冲区,就是一种文件。并且都只是内核当中的一段内存,管道只是一个入口,若是没有进程打开该内存,则该管道就不会创建。
管道又分为:
- 匿名管道
- 命名管道
二. 匿名管道
匿名管道是适用于有亲缘关系的进程之间的通信。
这里的fd是一个数组。一个有两个元素的数组,一个是fd[0]是管道的读端,fd[1]是管道的写端。
- 写:是先将要传送的数据写入到缓冲区中,再将缓冲区的内容写入到管道之中。
读:是将管道当中的数据先读到缓冲区当中,再将缓冲区中的数据打印到文件或者标准输出上。
管道在读的时候,发现没有可读的数据,有两种处理方法:- O_NONBLOCK disable:当前进程阻塞,就是一直在等,等到有数据可以读取。
- O_NONBLOCK enable:直接返回-1,errno值为EAGAIN。
当管道写满之后,也是有两种处理方法:
- O_NONBLOCK disable:阻塞式等待,等到有进程将管道中的数据读走。
- O_NONBLOCK enable:直接返回-1,errno值为EAGAIN。
- 若是所有管道写端对应的文件描述符被关闭,则read返回0。
- 如果所有的管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出
- 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性
- 当写入的数据量大于PIPE_BUF时,linux不保证写入的原子性
具体的匿名管道的实现代码如下:
//匿名管道的创建与使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(