MSGGET - Linux手册页

时间:2019-08-20 17:59:01  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2019-08-02

名称

msgget-获取系统V消息队列标识符

语法

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

int msgget(key_t key, int msgflg);

说明

msgget()系统调用返回与key参数值关联的System V消息队列标识符。它可用于获取先前创建的消息队列的标识符(当msgflg为零且键的值不为IPC_PRIVATE时),或用于创建新的消息队列。

如果key的值为IPC_PRIVATE或key不是IPC_PRIVATE,则创建新的消息队列,不存在具有给定密钥key的消息队列,并且在msgflg中指定了IPC_CREAT。

如果msgflg同时指定了IPC_CREAT和IPC_EXCL,并且消息密钥的队列已存在,则msgget()将errno设置为EEXIST失败。 (这类似于组合O_CREAT | O_EXCL对open(2)的影响。)

创建后,参数msgflg的最低有效位定义消息队列的权限。这些权限位的格式和语义与为open(2)的mode参数指定的权限相同。 (不使用执行权限。)

如果创建了新的消息队列,则其关联的数据结构msqid_ds(请参见msgctl(2))将按以下方式初始化:

*
msg_perm.cuid和msg_perm.uid设置为调用进程的有效用户ID。
*
msg_perm.cgid和msg_perm.gid设置为调用进程的有效组ID。
*
msg_perm.mode的最低有效9位被设置为msgflg的最低有效9位。
*
msg_qnummsg_lspidmsg_lrpid,msg_stime和msg_rtime设置为0。
*
msg_ctime设置为当前时间。
*
msg_qbytes设置为系统限制MSGMNB。

如果消息队列已经存在,则将验证权限,并检查是否将其标记为销毁。

返回值

如果成功,则返回值将是消息队列标识符(非负整数),否则为-1,其中errno表示错误。

错误说明

失败时,errno设置为以下值之一:

EACCES
存在用于密钥的消息队列,但是调用进程没有访问队列的权限,并且在控制其IPC名称空间的用户名称空间中不具有CAP_IPC_OWNER功能。
EEXIST
在msgflg中指定了IPC_CREAT和IPC_EXCL,但是密钥的消息队列已存在。
ENOENT
键的消息队列不存在,msgflg未指定IPC_CREAT。
ENOMEM
必须创建消息队列,但是系统没有足够的内存来存储新的数据结构。
ENOSPC
必须创建消息队列,但是将超过最大消息队列(MSGMNI)的系统限制。

遵循规范

POSIX.1-2001,POSIX.1-2008,SVr4。

备注

在Linux或任何版本的POSIX上,都不需要包含和。但是,一些旧的实现需要包含这些头文件,并且SVID也记录了这些头文件。打算移植到这样的旧系统的应用程序可能需要包含这些头文件。

IPC_PRIVATE不是标志字段,而是key_t类型。如果将此特殊值用作密钥,则系统调用将忽略msgflg的除最低有效9位之外的所有内容,并创建一个新的消息队列(成功时)。

以下是对影响msgget()调用的消息队列资源的系统限制:

MSGMNI
系统范围内的消息队列数限制。在Linux 3.19之前,此限制的默认值是使用基于可用系统内存的公式来计算的。从Linux 3.19开始,默认值为32,000。在Linux上,可以通过/ proc / sys / kernel / msgmni读取和修改此限制。

Linux notes

在2.3.20版之前,Linux将在计划删除的消息队列上为msgget()返回EIDRM。

BUGS

名称选择IPC_PRIVATE可能是不幸的,IPC_NEW将更清楚地显示其功能。

另外参见

msgctl(2),msgrcv(2),msgsnd(2),ftok(3),功能(7),mq_overview(7),sysvipc(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/