msgctl() - Unix,Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考资料
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于TP  

msgctl() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

msgctl - 消息控制操作

概要

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

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

描述

msgctl() 对标识符为 msqid 的消息队列执行由 cmd 指定的控制操作。

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


struct msqid_ds { struct ipc_perm msg_perm; /* Ownership and permissions time_t msg_stime; /* Time of last msgsnd() */ time_t msg_rtime; /* Time of last msgrcv() */ time_t msg_ctime; /* Time of last change */ unsigned long __msg_cbytes; /* Current number of bytes in queue (non-standard) */ msgqnum_t msg_qnum; /* Current number of messages in queue */ msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */ pid_t msg_lspid; /* PID of last msgsnd() */ pid_t msg_lrpid; /* PID of last msgrcv() */ };

ipc_perm 结构在 <sys/ipc.h> 中定义如下(突出显示的字段可以使用 IPC_SET 设置):


struct ipc_perm {
    key_t key;            /* Key supplied to msgget() */
    uid_t uid;            /* Effective UID of owner */
    gid_t gid;            /* Effective GID of owner */
    uid_t cuid;           /* Effective UID of creator */
    gid_t cgid;           /* Effective GID of creator */
    unsigned short mode;  /* Permissions */
    unsigned short seq;   /* Sequence number */
};

cmd 的有效值:

标签描述
IPC_STAT
 将与 msqid 关联的内核数据结构中的信息复制到 buf 指向的 msqid_ds 结构中。调用者必须对消息队列具有读取权限。
IPC_SET
 buf 指向的 msqid_ds 结构的某些成员的值写入与该消息队列关联的内核数据结构,并更新其 msg_ctime 成员。将更新结构的以下成员:msg_qbytesmsg_perm.uidmsg_perm.gid 和(msg_perm.mode 的最低有效 9 位)。调用进程的有效 UID 必须与消息队列的所有者 (msg_perm.uid) 或创建者 (msg_perm.cuid) 匹配,或者调用者必须具有特权。需要适当的特权(Linux:CAP_IPC_RESOURCE 功能)才能将 msg_qbytes 值提高到系统参数 MSGMNB 以上。
IPC_RMID
 立即删除消息队列,唤醒所有等待读取和写入进程(返回错误并设置 errnoEIDRM)。调用进程必须具有适当的特权,或者其有效用户 ID 必须是消息队列的创建者或所有者。
IPC_INFO(Linux 特定)
 将系统范围的消息队列限制和参数信息返回到 buf 指向的结构中。此结构的类型为 msginfo(因此需要强制转换),如果定义了 _GNU_SOURCE 功能测试宏,则在 <sys/msg.h> 中定义。

struct msginfo { int msgpool; /* Size in bytes of buffer pool used to hold message data; unused */ int msgmap; /* Max. # of entries in message map; unused */ int msgmax; /* Max. # of bytes that can be written in a single message */ int msgmnb; /* Max. # of bytes that can be written to queue; used to initialize msg_qbytes during queue creation (msgget()) */ int msgmni; /* Max. # of message queues */ int msgssz; /* Message segment size; unused */ int msgtql; /* Max. # of messages on all queues in system; unused */ unsigned short int msgseg; /* Max. # of segments; unused */ };

msgmnimsgmaxmsgmnb 设置可以通过同名的 /proc 文件更改;有关详细信息,请参见 proc(5)。
MSG_INFO(Linux 特定)
 返回一个 msginfo 结构,其中包含与 IPC_INFO 相同的信息,但以下字段返回有关消息队列消耗的系统资源的信息:msgpool 字段返回系统上当前存在的消 息队列数;msgmap 字段返回系统上所有队列中消息的总数;msgtql 字段返回系统上所有队列中所有消息的总字节数。
MSG_STAT(Linux 特定)
 返回一个 msqid_ds 结构,与 IPC_STAT 相同。但是,msqid 参数不是队列标识符,而是内核内部数组中的索引,该数组维护有关系统上所有消息队列的信息。

返回值

成功时,IPC_STATIPC_SETIPC_RMID 返回 0。成功的 IPC_INFOMSG_INFO 操作返回内核内部数组中最高使用条目的索引,该数组记录有关所有消息队列的信息。(此信息可与重复的 MSG_STAT 操作一起使用,以获取系统上所有队列的信息。)成功的 MSG_STAT 操作返回其索引在 msqid 中指定的队列的标识符。

出错时,返回 -1,errno 指示错误。

错误

失败时,errno 设置为以下之一:
标签描述
EACCES 参数 cmd 等于 IPC_STATMSG_STAT,但调用进程对消息队列 msqid 没有读取权限,并且没有 CAP_IPC_OWNER 功能。
EFAULT 参数 cmd 的值为 IPC_SETIPC_STAT,但 buf 指向的地址不可访问。
EIDRM 消息队列已删除。
EINVAL cmdmsqid 的值无效。或者:对于 MSG_STAT 操作,msqid 中指定的索引值指的是当前未使用的数组槽。
EPERM 参数 cmd 的值为 IPC_SETIPC_RMID,但调用进程的有效用户 ID 不是消息队列的创建者(在 msg_perm.cuid 中找到)或所有者(在 msg_perm.uid 中找到),并且进程没有特权(Linux:它没有 CAP_SYS_ADMIN 功能)。

注释

IPC_INFOMSG_STATMSG_INFO 操作由 ipcs(8) 程序用于提供有关已分配资源的信息。将来,这些操作可能会被修改或移动到 /proc 文件系统接口。

在 Linux 2.2 下,struct msqid_ds 中的各个字段是短整型,在 Linux 2.4 下已成为长整型。为了利用这一点,在 glibc-2.1.91 或更高版本下重新编译就足够了。(内核通过 cmd 中的 IPC_64 标志区分旧调用和新调用。)

符合标准

SVr4, POSIX.1-2001。

参见



previous next Printer Friendly

广告


  

广告



广告