进程间通信常见方式(4种,这里说管道、共享存储映射)

学习地址

IPC即进程间通信

进程间通信框架如下:
image

进程间通信方式如下:
image

管道得有血缘关系


管道(匿名管道)

  • 前提
    作用于有血缘关系的进程间

  • 实现原理
    内核借助环形队列机制,使用内核缓冲区实现

  • 特性
    image
    (文件、目录、软件链接占磁盘空间,称为真文件;管道、套接字、字符设备、块设备不占用磁盘空间,称为伪文件)

  • 局限性
    image
    image
    1、有两端,一端写,一端读
    3、一端要么写、要么读
    4、有血缘关系

  • pipe函数
    image

  • 管道的读写行为
    image

  • 父子间进程通信
    学习地址

image
上面写法输出结果在$符号后,而不是换行输出;
改成如下即可
image

  • 兄弟间进程通信
    与父子进程通信不同,父、兄、弟三者都有管道得读写端,兄弟间要想通信得把父进程读、写端关闭;
    image

  • 获取管道缓冲区大小

ulimit -a

image

  • 管道优劣
    image

命名管道fifo

框架
image
与管道框架一致

创建方式
image

实现非血缘关系进程通信
学习地址
框架
image


共享存储映射

文件进程间通信
父子进程共享打开的文件描述符;
如果文件中没有数据,read函数不会阻塞;
非血缘关系的两个子进程也可以通过文件通信;

  • 存储映射io
    将磁盘文件映射到内存
    image
    磁盘上的文件得用open write read close函数操作,在内存上就可以使用地址操作了可以使用的函数就多了;

image

  • 创建共享内存映射函数
    image
    MAP_SHARED 修改内存后,会同步到磁盘上
    MAP_PRIVATE 修改内存后,不会同步到磁盘上
    学习地址

image

image

mmap注意事项:
image

保险写法
image

image

错误示例
image

image


image


image

和fifo对比
image

进程间通信,创建文件后,获取文件描述符后,可以删掉文件,对通信没有影响;

  • 匿名映射

只适用于有血缘关系的进程间

image

下图展示参数变化了
image

若不支持此参数怎么办呢?
image
image
/dev/zero 想要多大有多大
/dev/null 想写多少都行



posted @ 2023-01-24 21:18  我爱茜茜公主  阅读(173)  评论(0)    收藏  举报