MSGGET - Linux手册页
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_qnum,msg_lspid,msg_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将更清楚地显示其功能。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。