当前位置:网站首页>unix环境编程 第十五章 15.7消息队列

unix环境编程 第十五章 15.7消息队列

2022-08-09 10:26:00 玛丽苏打肉饼

消息队列是消息的链接表,存储在内核中,由消息队列标识符标识,简称队列ID。

msgget用于创建一个新队列或者打开一个现有的队列。

#include <sys/msg.h>
int msgget(key_t key,int flag);
//成功返回消息队列ID,失败返回-1

在创建新的队列的时候,要初始化msqid_ds结构的下列成员:

  • ipc_perm结构按15.6.2节所述进行初始化。该结构中的mode成员按flag中的相应权限位设置。
  • msg_qnum,msg_lsqid,msg_lrpid,msg_stime和msg_rtime都设置为0。
  • msg_ctime设置为当前时间。
  • msg_qbytes设置为系统限制值。

msgsnd将新消息添加到队列尾端。

msgrcv用于从队列中获取消息。

msgctl函数对队列执行多种操作。它和另外两个与信号量及共享存储有关的函数都是XSI IPC的类似于ioctl的函数。

#include <sys/msg.h>
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
//成功返回0,出错返回-1

cmd参数指定对msqid指定的队列要执行的命令。

调用msgsnd将数据放到消息队列中

#include <sys/msg.h>
int msgsnd(int msqid,const void *ptr,size_t nbytes,int flag);
//成功返回0,失败返回-1

ptr参数指向一个长整型数,它包含了正的整型消息类型,其后紧接着的是消息数据。

当msgsnd返回成功的时候,消息队列相关的msqid_ds结构会随之更新,表明调用的进程ID,调用时间以及消息队列中的新增消息。

msgrcv从队列中取用消息。

#include <sys/msg.h>
ssize_t msgrcv(int msqid,void *ptr,size_t nbytes,long type,int flag);
//成功返回消息数据部分长度,出错返回-1

ptr参数指向一个长整型数,其后跟随的是存储实际消息数据的缓冲区。nbytes指定数据缓冲区的长度。若返回的消息长度大于nbytes,而且在flag中设置了MSG_NOERROR位,则该消息会被截断。如果没有设置这一标志,而消息又太长,则出错返回E2BIG。

参数type指定想要哪一种消息。

type==0,返回队列中的第一个消息。

type>0返回队列中消息类型为type的第一个消息。

type<0返回队列中消息类型值小于等于type绝对值的消息,如果这种消息有若干个,则取类型值最小的消息。

原网站

版权声明
本文为[玛丽苏打肉饼]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43873960/article/details/121641944