进程间通信(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

删除共享内存

相关推荐
Learn-Share_HY42 分钟前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
祖力552 小时前
进程间通信(IPC机制):信号
linux·运维·服务器·进程·进程间通信·多任务·ipc
GKxx2 小时前
在 HarmonyOS 上给 QEMU 搭一个最小 aarch64 Linux guest(内核 + busybox initramfs)
linux·华为·qemu·harmonyos·鸿蒙·鸿蒙pc
treacle田3 小时前
达梦数据库-Linux DM主备集群动态增加节点-记录总结
linux·运维·数据库·达梦主备集群动态扩展
ARM|X86+FPGA工业主板厂家3 小时前
基于Jetson TX2的矿用巡检机器人
linux·运维·机器人
杨云龙UP3 小时前
Oracle 19c RMAN历史备份清理失败:CONTROL_FILE_RECORD_KEEP_TIME 问题排查与整改实战
linux·运维·网络·数据库·oracle·rac
Alphapeople4 小时前
moveit真机部署
linux·运维·服务器
Eminem894 小时前
2、k8s环境规划
linux·运维·kubernetes
打团从来人不齐4 小时前
Linux服务器搭建笔记-008:台式机共享WIFI
linux·服务器·笔记