进程间通信——消息队列

目录

一、定义

二、结构

三、消息队列的创建

(1)函数原型:

(2)参数:

(3)相关示例:

四、消息队列的发送与接收

1.函数msgsnd向消息队列发送消息

2.函数msgrcv向消息队列接收消息

3.消息队列用完之后从内核中移除


一、定义

1.消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列尾部,接受进程从队列头读取信息。

2.多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列的尾部,接收进程从消息队列头部读取信息,信息一旦被读出就从队列中删除。

二、结构

struct msgbuf
{
    long mtype;//消息类型
    char mtext[128];//消息的数据
}

三、消息队列的创建

1.在UNIX中,采用msgget函数创建消息队列;

(1)函数原型:

int msgget(key_t key,int msgflg);

(2)参数:

key:消息队列的关键字

 key_t key = ftok(把一个已存在的路径名和一个整数标识符转换成IPC键值);

参数msgflg的低九位指定队列的属主、属组和其他用户的访问权限,其他位指定消息队列的创建方式;

创建方式参数:

IPC_CREAT: 创建,如存在则打开;

IPC_EXCL: 与IPC_CREAT使用,单独使用无意义,创建时,如存在则失败;

(3)相关示例:

例1.创建关键字位0x1234,访问权限位0666的消息队列,如队列已经存在返回其标识号。

int msgid;
msgid = msgget(0x1234,0666|IPC_CREAT);

例2.创建关键字位0x1234,访问权限位0666的消息队列,如队列已经存在则报错。

int msgid;
msgid = msgget(0x1234,0666|IPC_CREAT|IPC_EXCL);

四、消息队列的发送与接收

1.函数msgsnd向消息队列发送消息

(1)函数原型:

int msgsnd(int msqid,void *msqp,int msgsz,int msgflg);

(2)参数

msgid:发送消息队列的标识号;

msgp:指向存储待发送消息内容的内存地址;

msgsz:指定长度,仅记载数据的长度;

msgflg:控制消息发送的方式,有阻塞和非阻塞两种方式;非阻塞 IPC_NOWAIT

2.函数msgrcv向消息队列接收消息

(1)函数原型:

int msgrcv(int msqid,void *msqp,int msgsz,long msgtyp,int msgflg);

(2)参数

msgid:发送消息队列的标识号;

msgp:指向存储待发送消息内容的内存地址;

msgsz:指定长度,仅记载数据的长度;

msgtyp:指定读取消息的类型;

{0:读取消息队列中的第一个消息;

正整数:读取消息队列中第一个类型为msgtyp的消息;

负整数:读取消息队列中第一个类型小于或等于msgtyp的绝对值的消息;

}

msgflg:控制消息发送的方式,有阻塞和非阻塞两种方式;

非阻塞 IPC_NOWAIT

截断方MSG_NOERROR

3.消息队列用完之后从内核中移除

(1)函数原型:

int msgctl(int msqid,int cmd,struct msqid_ds *buf);

(2)参数

IPC_RMID:消息队列链表从内核中移除

这里的具体参数查找man手册

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星筠君辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值