msgget() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于TP  

msgget() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

msgget - 获取消息队列标识符

语法

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

int msgget(key_t key, int msgflg);

描述

msgget() 系统调用返回与key参数值关联的消息队列标识符。如果key的值为IPC_PRIVATE,或者key不是IPC_PRIVATE且不存在具有给定键key的消息队列,并且在msgflg中指定了IPC_CREAT,则会创建一个新的消息队列。

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

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

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

标签描述
msg_perm.cuidmsg_perm.uid设置为调用进程的有效用户ID。
msg_perm.cgidmsg_perm.gid设置为调用进程的有效组ID。
msg_perm.mode的最低有效9位设置为msgflg的最低有效9位。
msg_qnummsg_lspidmsg_lrpidmsg_stimemsg_rtime设置为0。
msg_ctime设置为当前时间。
msg_qbytes设置为系统限制MSGMNB
如果消息队列已存在,则会验证权限,并检查它是否被标记为要销毁。

返回值

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

错误

如果失败,errno将设置为以下值之一
标签描述
EACCES 对于key存在消息队列,但调用进程没有权限访问该队列,并且没有CAP_IPC_OWNER功能。
EEXIST 对于key存在消息队列,并且msgflg同时指定了IPC_CREATIPC_EXCL
ENOENT 对于key不存在消息队列,并且msgflg没有指定IPC_CREAT
ENOMEM 必须创建一个消息队列,但系统没有足够内存用于新的数据结构。
ENOSPC 必须创建一个消息队列,但将超过消息队列最大数量的系统限制(MSGMNI)。

备注

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

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

标签描述
MSGMNI 系统范围内的最大消息队列数量:策略相关(在 Linux 上,可以通过/proc/sys/kernel/msgmni读取和修改此限制)。

缺陷

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

符合标准

SVr4、POSIX.1-2001。

Linux 备注

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

参见



previous next Printer Friendly

广告


  

广告



广告