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

删除共享内存

相关推荐
happy_king_zi8 小时前
Kafka 3.9.2 KRaft 模式三节点集群完整部署指南
kafka·消息队列
天天喝旺仔8 小时前
Linux 性能排查实战:用 perf、strace 与火焰图定位 CPU、内存与 IO 瓶颈
linux·性能优化·运维开发
LuminousCPP8 小时前
Linux系统编程(二):从目录树到命令执行|路径、环境变量、alias 与文件操作入门
linux·经验分享·笔记
第十人i8 小时前
Linux 系统初始化配置清单:新服务器快速部署
linux·服务器
LongRunning8 小时前
【Linux】RK3568-OpenCV+YOLO(七)
linux
j7~9 小时前
【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页
linux·网络·网络协议·学习·http·网络编程
傲世仙尊9 小时前
设计者的取舍-路径fork的诞生与全局文件队列
linux
逐流人9 小时前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
Tairitsu_H9 小时前
[Linux] 编辑器vim、编译器和动静态链接
linux·vim·gcc·g++·动态链接·静态链接
lzx_0029 小时前
Linux指令(一) 简单了解部分指令
linux