进程通信
管道
父子进程创建命令
实现ls | wc -l
左边写端 ,右边读端
父进程写 子进程读
int fd[2];
pipe(fd);
fd[1] 是写
fd[0]是读
读之前关闭写
写之前关闭读
兄弟进程创建命令
无法进行管道通信可能是父进程也把握了读端和写端
可能会流入到父进程
管道缓存区
函数查询
fd[0,1]都可以,name用来表示查什么的
管道的优缺点
命名管道
fifo命名管道
一个文件是写文件,一个文件是读文件
mkfifo p1
./ 加管道名写 ./ 加管道读
管道里面的数据没法重复读取
两个管道同时写,也得排队读取
共享内存 映射
文件间可以进行进程通信
无血缘进程也可以进程通信
同一个文件不同进程打开,os内核同一个缓冲区
写到内核缓冲区,打开也是打开内核的缓冲区
共享内存(效率最高)
mmap函数
建立映射
借助文件映射,创建内存映射区
addr :指定映射区的首地址。通常传NULL,表示让系统自动分配
length:共享内存映射区的大小≤文件的实际大小
prot:添加共享内存映射区的读写属性,PROTREAD. PROTWRITE PROTREAD|PROTWRITE
flags :标注共享内存映射区的共享属性
MAP_SHARD:对共享内存所做的修改会反应到物理磁盘文件上
MAP_PRIVATE:不会反应
fd :用来创建共享内存映射区的那个文件的文件描述符
offset:默认0,表示映射全部文件,偏移位置,必须是4k的整数倍;
返回值:
munmap释放共享内存映射
mmap创建映射区
创建文件的大小要大于创建的共享映射区的大小,不然会报总线错误
然后 文件的权限和共享映射区的权限 必须一致
mmap使用的注意事项
mmap保险调用方式
1.fd =open("文件名",O_RDWR);//读写文件权限
2.mmap(NULL,有效文件大小,PROTREAD|PROTWRITE,MAP_SHARD,fd,0);
mmap父子进程通信
MAP_SHARD 父子进程共享映射区
读共享写复制,
子进程要修改,修改的复制的那一份,父进程是原来的自己的那一份
这里从建立映射区开始
非血缘关系的mmap进程通信
同步读,共享内存里的都可以读
总结:
匿名映射
直接创建映射区
只适合没有血缘关系的进程不适合通信
不需要打开文件
MAP_ANON 只 在linux系统有效