消息队列-msgctl

msgctl-系统V消息控制操作

头文件

#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / msg.h>

函数

   int msgctl(int msqid ,int cmd ,struct msqid_ds * buf );控制消息队列

第一个参数msgqid 是消息队列对象的标识符。

所述的msqid_ds数据结构定义在在<sys / msg.h>如下:

struct msqid_ds {
           struct ipc_perm msg_perm; / *所有权和权限* /
           time_t msg_stime; / *最后一次msgsnd(2)的时间* /
           time_t msg_rtime; / *最后一次msgrcv(2)的时间* /
           time_t msg_ctime; / *创建时间/最后时间
                                            通过msgctl()修改* /
           无符号长__msg_cbytes;/ *当前的字节数
                                            队列(非标准)* /
           msgqnum_t msg_qnum; / *当前消息数
                                            在队列中* /
           msglen_t msg_qbytes; / *最大字节数
                                            队列中允许* /
           pid_t msg_lspid; / *最后一个msgsnd(2)的PID * /
           pid_t msg_lrpid; / *最后一个msgrcv(2)的PID * /
       };

msgid_ds结构的字段如下:

       msg_perm    这是一个ipc_perm结构(请参见下文),用于指定消息队列上的访问权限。

       msg_qnum    当前在消息队列上的消息数。

       msg_qbytes邮件文本上允许的最大字节数消息队列。

       msg_lspid   执行最后一个msgsnd(2)系统的进程的ID呼叫。

       msg_lrpid   执行最后一个msgrcv(2)系统的进程的ID呼叫。

       msg_stime   上一次msgsnd(2)系统调用的时间。

       msg_rtime   上一次msgrcv(2)系统调用的时间。

       msg_ctime   创建队列的时间或上一个msgctl()IPC_SET的时间操作。
   所述的ipc_perm结构定义如下(突出显示的字段可使用IPC_SET设置):
struct ipc_perm {
           key_t __key; / *提供给msgget(2)的密钥* /
           uid_t           uid ; / *所有者的有效UID * /
           gid_t           gid ; / *所有者的有效GID * /
           uid_t cuid; / *创建者的有效UID * /
           gid_t cgid; / *创建者的有效GID * /
           无符号短模式 ; / *权限* /
           无符号的短__seq; /* 序列号 */
       };

第二个参数是函数要对消息队列进行的操作,它可以是:

	IPC_STAT:取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构中。

	IPC_SET:设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds结构给出。

	IPC_EMID:将队列从系统内核中删除
	IPC_INFO(特定于Linux)
          返回有关系统范围内消息队列限制的信息,以及buf指向 的结构中的参数。这种结构如果定义了_GNU_SOURCE功能测试宏,则其类型为msginfo(因此需要强制转换),在
           <sys / msg.h>中定义:

              struct msginfo {

                  int msgpool; / *缓冲池的大小(以千字节为单位) 用于保存消息数据;在内核中未使用* /
                  
                  int msgmap; / *消息中的最大条目数地图; 在内核中未使用* /
                  int msgmax; / *可以使用的最大字节数写在单个消息中* /
                  int msgmnb; / *可以使用的最大字节数写入队列;用于初始化队列创建过程中的单位msg_qbytes(msgget(2))* /
                  int msgmni; / *消息队列的最大数量* /
                  int msgssz; / *消息段大小;在内核中未使用* /
                  int msgtql; / *所有队列上的最大消息数在系统中 在内核中未使用* /
                   unsigned short int msgseg; / *最大段数;在内核中未使用* /
              };

MSG_INFO (Linux-specific)

   MSG_STAT (Linux-specific)
        
   MSG_STAT_ANY (Linux-specific, since Linux 4.17)

返回值

   成功时,IPC_STAT,IPC_SET和IPC_RMID返回0。成功的IPC_INFO或MSG_INFO操作返回内核内部阵列中使用最高的条目的索引,该索引记录有关所有 消息队列的信息。(此信息可以与重复的MSG_STAT 或MSG_STAT_ANY操作一起使用,以获取有关系统上所有队列的信息。)成功的MSG_STAT或MSG_STAT_ANY操作将返回其索引在msqid中给出的队列的标识符。

   发生错误时,返回-1,并带有errno表示错误。

版权声明:本文为weixin_43117602原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。