一、铺垫
1.进程间通信的本质是对共享资源(同一块资源)进行操作;
2.匿名管道是具有血缘关系的进程对共享资源的操作;所以只能先创建,再采用fork()函数,创建父子进程,对管道进行操作;
3.匿名管道是提供字节流式服务;也就是说,可以用read和write进行操作;
4.匿名管道的生命周期是跟随进程的,进程退出,意味着管道的释放;
5.匿名管道是半双工的—数据只能向一个方向流动,需要双方通信时,必须要建立两个管道
6.通信的本质是对同一块资源进行操作(写和读),当有一方关闭了读端或写端;另一方应该怎样应对,才是匿名管道通信需要着重解决的本质问题
二、匿名管道
管道(什么是管道):
1.管道是Unix中最古老的进程间通信的形式。
2.我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
函数:
#include <unistd.h>功能:创建一无名管道原型int pipe(int fd[2]);参数fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端返回值:成功返回0,失败返回错误代码
三、匿名管道的几种情况
1.写端正在写入,读端关闭
读端关闭,写端在写数据,也就没了意义,写进程退出;
2.读端正在读取,写端关闭
写端关闭,管道内还有数据,读完数据后,读进程再退出;
3.读端读的慢,写端写的快
写端快,管道一定会被写满;写进程会被阻塞,但是写端不会因为一读取数据,就马上写入,而是缓冲区有了足够的大小,才会写入数据;
4.写端写的慢,读端读的快
读进程会阻塞,直到管道有数据才会读取;
四、命名管道
//程序中创建int mkfifo(const char *filename,mode_t mode);
第一个参数:代表的是创建的文件名称;
第二个参数:创建的文件所拥有的权限,可读可写可执行,也就是所谓的777;
对文件进行操作,就要使用read和write接口
命令行中创建
mkfifo filename //命令
五、system V共享内存
有概念就好