【linux系统编程学习笔记】第五节:进程通信方式之IPC通信机制1(消息队列)

“我希望那个世界的自己,可以是一名旅行家,周游世界,记录世界各地的风景。”
I hope I can be a traveler, traveling around the world and recording the worldwide scenery.

进程通信方式之IPC通信机制(消息队列)

System-V IPC通信机制

程序构架流程:

IPC 对象的 key

相关API

key_t ftok(const char *pathname, int proj_id);

消息队列

int msgget(key_t key, int msgflg);

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg)


 

System-V IPC通信机制

什么是IPC:

消息队列、共享内存和信号量被统称为system-VIPC,V是罗马数字5,是Unix的AT&T分支的其中一个版本,一般习惯称呼他们为IPC对象,这些对象的操作接口都比较类似,在系统中他们都使用一种叫做key的键值来唯一标识,而且他们都是“持续性”资源——即他们被创建之后,不会因为进程的退出而消失,而会持续地存在,除非调用特殊的函数或者命令删除他们

  1. 内核当中为了增强进程与进程之间数据交互及效率的一种机制的对象

IPC里面有什么:

  1. 消息队列:(你可以完全的理解它是一个增强型的管道
    1. 具备管道的思想,可以往里面发送及读取数据
    2. 每一个数据都可以夹带类型
    3. 我们可以指定只读指定的类型的数据,其他数据,继续存放在这个消息队列中
  2. 共享内存:
    1. 速度最快的一种进程间通信方式
    2. 在内核空间(物理内存)中开辟一块内存出来,映射给不同的进程的虚拟内存中,这样我们就可在不同的进程中访问同一块内存
  3. 信号量:
    1. 操作某种资源的进程间的同步互斥操作体系,相当于一个增强型的全局变量(全局于不同进程中),用来代表一种资源,当资源没有的时候,我们会陷入睡眠。有如下3个特点
      1. 进程都可以访问这个变量
      2. 进程可以加减这个变量
      3. 当这个变量减到为0的时候,你再想去减它,他就让你进程陷入睡眠,等到这个变量的值你减的时候不会小于0,他才会让你进程继续往下面工作

程序构架流程

  1. 新建IPC对象,获取IPC的key
  2. 新建及初始化消息队列/共享内存/信号量对象
  3. 根据不同的对象开始操作
  4. 删除对象

 

IPC 对象的 key

跟文件类型,进程每次“打开”一个IPC对象,就会获得一个表征这个对象的ID,进而再使用这个ID来操作这个对象。IPC对象的,但是ID是可变的。key类似于文件的路径名,ID类似于文件的描述符。

系统中的多个进程,如果他们需要使用IPC对象来通信,那么他们必须持有这个对象的键值key:

相关API

key_t ftok(const char *pathname, int proj_id);

#include <sys/types.h> 
#include <sys/ipc.h>  

key_t ftok(const char *pathname, int proj_id);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值