[Linux系统编程]进程通信-消息队列(六)

本文详细介绍了Linux系统编程中的消息队列,包括消息队列的简介、查看和删除指令、相关函数(msgget、msgsnd、msgrcv、msgctl)的用法,并通过fork创建父子进程实现消息通信的案例。同时,提到了消息队列的特性,如消息类型、链表结构和消息数量的增减。最后,讨论了ipcs指令和系统参数的查看。
摘要由CSDN通过智能技术生成

文章主要对消息队列的函数使用和案例实现进行总结,用于个人复习

09-05
注意消息队列的创建和访问命令的不同
本质为链表,结构体的参数一long类型用来指定类型。可以指定发送和接受的类型。

1 消息队列的简介

消息队列作为通信方式的一种,在本质上是位于内核空间的链表,每个链表的节点都是一条消息。每条消息都有自己的消息类型且消息类型必须大于0。每种消息类型都被所对应的链表所维护。在这里插入图片描述
如图1,2,3,4表示不同的数据,消息类型为 0 的链表记录了所有消息加入队列的顺序,其中红色箭头表示消息加入的顺序。

图片及简介参考自:
简书博主小Q_wang

2 linux 下消息队列查看和删除指令

  • ipcs --查看进程间通信状态(包括键值、id.....如下)
  • ipcs -q --只查看消息队列的信息
  • ipcrm -q id --删除指定的消息队列(id为消息队列的标识符)

在这里插入图片描述

3消息队列相关函数

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// 访问或创建消息队列 并返回消息队列的标识符
int msgget(key_t key, int msgflg)
// 将消息发送到消息队列
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);
// 查看、设置、删除消息队列
int msgctl(int msqid, int command,struct msqid_ds *buf)

3.1 msgget函数

函数作用:
访问一个消息队列或创建一个消息队列设置权限,并返回消息队列的标志符
参数使用:

  • int msgget(key_t key, int msgflg)
  • 参数一:键值或者理解成暗号,大于0的32位整数
    • 可以手动输入一个整形
    • 或者通过ftok返回的IPC键值
  • 参数二:IPC_CREAT|0666 表示创建并设置权限
    (后面权限数字不固定)
    IPC_EXCL 表示访问
  • 返回值:成功返回消息队列号, 失败返回0并设置 errno

3.2 msgsnd函数

函数作用:
将消息写入到消息队列,或者说发送消息
参数使用:

  • int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
  • 参数一:消息队列标识符
  • 参数二:发送到队列的信息结构体地址,可以是任意类型的结构体,只要求第一个字段必须为long
  • 参数三:要发送信息的大小,不包含信息类型占用的4个字节
  • 参数四:
    • 0:若消息队列满了,阻塞等待
    • IPC_NOWAIT:若消息队列满了,不阻塞直接返回
    • IPC_NOERROR:实际信息长于参数三设定,截取部分发送,其余抛弃,不报错
  • 返回值:0 表示成功,-1 失败并设置 errno

3.3 msgrcv函数

函数作用:
从消息队列读取信息,每读取一条少一条,否则阻塞等待
参数使用:

  • ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
  • 参数一:消息队列标识符
  • 参数二:存放接受到的信息结构体地址,要求与发送类型一致。
  • 参数三:接收消息大小,不含消息类型占用的4个字节
  • 参数四:
    • 0:接受第一个消息
    • ‘> 0:接受与参数二设置消息类型相同的第一个消息
    • <0:接收类型等于或者小于参数二设置消息类型的第一个消息
  • 参数五:0: 阻塞式接收消息,不存在则阻塞等待
    其余几种:IPC_NOWAIT IPC_EXCEPT IPC_NOERROR 不多介绍
    返回值:0 表示成功,-1 失败并设置 errno

发送or接收的信息结构体如下:

struct msgbuf{
   
    long type; // 必须为long类型 >0
    // 消息正文,可自由设定....  
};
----------------举例--------
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Windalove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值