图控大叔
构图传递思想
阅读从未如此简单!!!
01
前言
继续跟着之前推文的步骤,继续分享与Linux进程间通信方式相关的推文,本次的推文内容是IPC通信机制的简述。
02
什么是IPC
IPC
内核当中为了增强进程与进程之间数据交互及效率的一种机制的对象
英文名
Inter Process Communication
中文名
进程间通信
03
IPC包含什么?
2,IPC里面有什么:
1、消息队列:
你可以完全的理解它是一个增强型的管道:
1.1、具备管道的思想,可以往里面发送及读取数据
1.2、每一个数据都可以夹带类型
1.3、我们可以指定只读指定的类型的数据,其他数据,继续存放在这个消息队列中
2、共享内存:
速度最快的一种进程间通信方式:
在内核空间(物理内存)中开辟一块内存出来,映射给不同的进程的虚拟内存中,
这样我们就可在不同的进程中访问同一块内存
3、信号量:
操作某种资源的进程间的同步互斥操作体系,
相当于一个增强型的全局变量(全局于不同进程中),
用来代表一种资源,当资源没有的时候,我们会陷入睡眠
信号量的特点:
3.1、进程都可以访问这个变量
3.2、进程可以加减这个变量
3.3、当这个变量减到为0的时候,你再想去减它,
它就让你进程陷入睡眠,等到这个变量的值你减的时候不会小于0,
它才会让你进程继续往下面工作
04
IPC编程流程
程序构架流程
1,新建IPC对象,获取IPC的key
1.1、ftok(const char *pathname, int proj_id);
2,通过key初始化消息队列/共享内存/信号量对象
2.1、并且获取相应的ID
2.1.1、int msgget(key_t key, int msgflg)
消息队列
2.1.2、int shmget(key_t key, size_t size, int shmflg)
共享内存
2.1.3、int semget(key_t key, int nsems, int semflg);
信号量
3,根据不同的对象开始操作
...中间各种骚操作
4,删除对象
05
通用API
key_t ftok(const char *pathname, int proj_id);
需包含头文件
#include
#include
函数功能:获取一个IPC对象的key,
方便我们在后期通过这一个key创建一个IPC对象,
其可以为共享内存或者消息队列或者信号量
参数:
pathname:一个路径名,用来通过和一个路径与该函数的第二个参数去得到一个IPC的key
proj_id:这个是一个不为0的小于或等于255的数值,用来跟pathname组合得到IPC的key
返回值:
成功返回一个IPC对象的key值,失败则返回-1,errno会被设置
06
其他说明
同一类型对象唯一ID说明
1、fork函数创建时的有效参数
2、各种对象的ID获取
以上两个步骤,
1、对于共享内存和信号量而言,需一致
2、对于消息队列而言,要对type进行设置
07
结尾
本次推文内容到这里就结束了,本次的内容只是推IPC通信机制的组成作简要说明,如需深入了解的童鞋,可自行查找资料。