进程间通信(IPC机制):消息队列与共享内存

一、消息队列

消息队列:

  1. 将进程间通信的数据封装成消息体发送;

  2. 增加消息类型,可以根据消息的类型设置数据的优先级。

  1. 获取IPC的key值:ftok();

  2. 创建消息队列 :msgget();

  3. 发送消息队列消息: msgsnd();

  4. 接收消息队列消息 :msgrcv();

  5. 删除消息队列 : msgctl();

cpp 复制代码
key_t ftok(const char *pathname, int proj_id);
功能:产生一个IPC对象key值
参数:
    pathname:路径名
    proj_id:项目id
返回值:
    成功:key值
    失败:-1
cpp 复制代码
int msgget(key_t key, int msgflg);
功能:根据key值创建一个消息队列
参数:
    key: IPC key值
    msgflg:IPC_CREAT|0664
返回值:
    成功:消息队列ID
    失败:-1
cpp 复制代码
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:发送消息队列的消息
参数:
    msqid:消息队列ID
    msgp:要发送的消息体
                struct msgbuf {
                    long mtype; /* message type, must be > 0 */ 消息类型
                    char mtext[1]; /* message data */ 消息正文
                                };
    msgsz:消息正文大小
    msgflg :标志位:0:默认方式发送
返回值:
    成功:0
    失败:-1
cpp 复制代码
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:操作IPC对象对应的消息队列
参数:
    msqid:消息队列的id
    cmd:操作方法:
        IPC_STAT:获取状态操作
        IPC_SET: 设置
        IPC_RMID:删除操作
    buf:
        IPC_RMID :buff-》NULL
返回值:
    成功:0
    失败:-1
cpp 复制代码
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                int msgflg);
功能:从消息队列中接收消息
参数:
    msqid:消息队列ID
    msgp :要接受的消息的存储位置
    msgsz:消息正文的大小
    msgtyp:消息类型
    msgflg:标志位:0:默认方式
返回值:
    成功:返回实际消息正文的大小
    失败:-1

IPC对象命令:

cpp 复制代码
ipcs -a
查看系统中的IPC对象
ipcrm -q msgid
ipcrm -Q msgkey
删除消息队列

二、共享内存

共享内存:进程间效率最高的通信方式

利用内存映射技术,避免了数据的反复拷贝

cpp 复制代码
int shmget(key_t key, size_t size, int shmflg);
功能:创建共享内存并获得共享内存的id
参数:
    key :IPC对象key值
    size:共享内存的大小(PAGE_SIZE(4096字节)整数倍)
    shmflg: IPC_CREAT | 0664
返回值:
    成功:共享内存的ID
    失败:-1
cpp 复制代码
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:建立共享内存和用户空间的内存映射
参数:
    shmid:共享内存id
    shmaddr:映射的用户空间首地址
            NULL :由操作系统选择用户空间并以返回值的方式返回空间首地址
    shmflg :
            SHM_RDONLY :只读
            !SHM_RDONLY :读写
返回值:
    成功:映射的用户空间首地址
    失败:(void *)-1
cpp 复制代码
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存
参数:
    shmid:共享内存id
    cmd:操作指令
        IPC_RMID: 删除操作
    buf: NULL
返回值:
    成功:0
    失败:-1

ipcs -a

查看IPC对象。

ipcrm -m shmid

ipcrm -M shmkey

删除共享内存

相关推荐
HideF4 小时前
Linux
linux·服务器·网络
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
丰锋ff8 小时前
压缩命令笔记
linux
GeW9 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
by2099910 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
cq林志炫10 小时前
两个Linux服务器之间同步文件
linux·运维·服务器
无人生还别怕11 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
企鹅侠客12 小时前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
易点云徐源12 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
第404号工位13 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构