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

删除共享内存

相关推荐
Apipi*19 分钟前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP1 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC4 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding4 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK4 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2084 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)4 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6254 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida6 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
zly35007 小时前
centos7 mount设备挂载 /dev/sda1/硬盘挂载
linux·运维·服务器