1.IPC
1.什么是IPC?
Inter Process Communication
2.进程间通信常用的几种方式
1,管道通信:有名管道,无名管道
2,信号- 系统开销小
3,消息队列-内核的链表
4,信号量-计数器
5,共享内存
6,内存映射
7,套接字
2.无名管道
1.管道的概念 
本质
内核缓冲区
伪文件-不占用磁盘空间
特点:
两部分:
读端,写端,对应两个文件描述符
数据写端流入,读端流出
操作管理的进程被销毁之后,管道自动被释放
管道默认是阻塞的
2.管道的原理 pipe
内部实现方式:队列
环形队列
特点:先进先出
缓冲区大小
默认4K
大小会根据实际情况做适当调整
3.管道的局限性
队列:
数据只能读取一次,不能重复读取
半双工:
单工:遥控器
半双工:对讲机 数据传输方向是单向的
双工:电话
匿名管道
适用于有血缘关心的进程 (父子进程)
4.创建匿名管道
int pipe(int fd[2])
fd‐传出参数:
fd[0]‐读端
fd[1]‐写端
返回值:
0:成功
‐1:创建失败
为什么是3和4呢?
看之前的linux标准文件描述符,它是按着顺序排列的,所以3是读端、4是写端
图一
5.父子进程使用管道通信
先创建管道再创建父子进程
父/子进程在读的时候,其写端要关闭
实现 ps aux| grep "bash" (终端)
数据重定向:dup2
由图一知道:要重定向是因为默认是写到屏幕的,我们要改成写到管道里
6.管道的读写行为
读操作
有数据
read(fd[1]) 正常读,返回读出的字节数
无数据
写端被全部关闭,read返回0,相当于读文件到了尾部
没有全部关闭
read阻塞
写操作
读端全部关闭
管道破裂,进程被终止
内核给当前进程发送信号SIGPIPE-13,默认处理动作
读端没全部关闭
缓冲区写满了
write阻塞
缓冲区没满
write继续写,直到写满,阻塞
如何设置非阻塞?
默认读写两端都阻塞
设置读端为非阻塞pipe(fd)
fcntl-变参函数
复制文件描述符-dup
修改文件属性-open的时候对应flag属性
设置方法
//获取原来的flags
int flags = fcntl(fd[0],F+GETFL);
//设置新的flags
flag |=O_NONBLOCK;
fcntl(fd[0],F_SETFL,flags);
fcntl(fd[0],F_SETFL,flags);