进程间通信常见方式(4种,这里说管道、共享存储映射)
IPC即进程间通信
进程间通信框架如下:
进程间通信方式如下:
管道得有血缘关系
管道(匿名管道)
-
前提
作用于有血缘关系的进程间 -
实现原理
内核借助环形队列机制,使用内核缓冲区实现 -
特性
(文件、目录、软件链接占磁盘空间,称为真文件;管道、套接字、字符设备、块设备不占用磁盘空间,称为伪文件) -
局限性
1、有两端,一端写,一端读
3、一端要么写、要么读
4、有血缘关系 -
pipe函数
-
管道的读写行为
-
父子间进程通信
学习地址
上面写法输出结果在$符号后,而不是换行输出;
改成如下即可
-
兄弟间进程通信
与父子进程通信不同,父、兄、弟三者都有管道得读写端,兄弟间要想通信得把父进程读、写端关闭;
-
获取管道缓冲区大小
ulimit -a
- 管道优劣
命名管道fifo
框架
与管道框架一致
创建方式
实现非血缘关系进程通信
学习地址
框架
共享存储映射
文件进程间通信
父子进程共享打开的文件描述符;
如果文件中没有数据,read函数不会阻塞;
非血缘关系的两个子进程也可以通过文件通信;
- 存储映射io
将磁盘文件映射到内存
磁盘上的文件得用open write read close函数操作,在内存上就可以使用地址操作了可以使用的函数就多了;
- 创建共享内存映射函数
MAP_SHARED 修改内存后,会同步到磁盘上
MAP_PRIVATE 修改内存后,不会同步到磁盘上
学习地址
mmap注意事项:
保险写法
- mmap父子进程通信
学习地址
错误示例
- mmap无血缘关系进程通信
学习地址
写
读
和fifo对比
进程间通信,创建文件后,获取文件描述符后,可以删掉文件,对通信没有影响;
- 匿名映射
只适用于有血缘关系的进程间
下图展示参数变化了
若不支持此参数怎么办呢?
/dev/zero 想要多大有多大
/dev/null 想写多少都行
如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。