zoukankan      html  css  js  c++  java
  • mq_open

    NAME

    mq_open - 打开一个消息队列 (REALTIME)

    SYNOPSIS

    #include <mqueue.h>
    mqd_t mq_open(const char *name, int oflag, ...)
    mqd_t mq_open(const char *name, int oflag, mode_t mode, mq_attr* attr) //O_CREAT

    DESCRIPTION

    mq_open() 函数会通过一个消息队列描述符(类型是mqd_t)建立一个进程与一个消息队列的连接.

    该函数会创建一个打开的消息队列的描述符, 其他函数就可以通过这个描述符操作消息队列.

    PARAMETERS

    name

    参数 name 是一个指向消息队列名称的指针. 但是名字是否出现在文件系统中,是否对其他以路径名为参数的函数可见是未定义的.

    参数 name 的长度限制是由系统实现决定的(如何获取这个限制),不需要遵守路径名的限制 {PATH_MAX} 和 {NAME_MAX}.

    如果 name 参数以"/"字符开头, 只有name没有被删除,所有使用相同name值调用mq_open函数的线程,访问的都是同一个消息队列,

    如果 name 参数不是以"/"字符开头,效果是由系统实现决定的.所以name参数一定要以"/"字符开头.

    oflag

    参数 oflag 表示想要访问(receive/send)消息队列的方式.

    参数 oflag 是由下列宏组合计算出来的, 注意必须包含前3个(访问模式) 中的一个:

    O_RDONLY (只读)

    打开一个消息队列用来接受消息.

    调用进程可以使用mq_open返回的描述符用于函数 mq_receive(), 但是不能用于函数 mq_send().

    一个消息队列可以在相同或不同的进程中多次打开用来接收消息.

    O_WRONLY (只写)

    打开一个消息队列用来发送消息.

    调用进程可以使用mq_open返回的描述符用于函数 mq_send(), 但是不能用于函数 mq_receive().

    一个消息队列可以在相同或不同的进程中多次打开用来发送消息.

    O_RDWR (读写)

    打开一个消息队列用即可用来发送消息也可以用来接受消息.

    调用进程可以使用任何支持O_RDONLY 和O_WRONLY 访问模式的函数.

    一个消息队列可以在相同或不同的进程中多次打开用来发送消息.

    Any combination of the remaining flags may be specified in the value of oflag:

    O_CREAT (创建)

    创建一个消息队列. 使用这个参数需要追加2个参数: mode(类型是mode_t), 和attr(类型是mq_attr*).
    如果name参数指定的消息队列已经存在, 那么这个参数将不起任何作用, 除非像下面 O_EXCL 中提到的情况;
    否则, 会创建一个空的消息队列. 消息队列的用户ID会被设置成这个进程的实际的用户ID.
     消息队列的组ID会被设置成这个进程的实际的组ID; 然而, 如果参数name 指向的消息队列在文件系统中可见, 那么组ID会被设置成包含消息队列的目录的组ID.
    如果参数mode中的位与文件权限中位不同,这种情况是未定义的. 
    如果 attr 是 NULL, 创建的消息队列是系统实现的默认属性. 如果 attr 不是 NULL 并且调用进程对参数name指定的文件有特定的权限(什么权限),
    那么消息队列的属性 mq_maxmsg 和 mq_msgsize 会被设置成 attr 中的属性. 属性 mq_flags 和 mq_curmsgs 会被忽略.
    如果 attr 不是 NULL , 并且调用进程对参数name指定的文件没有特定的权限,函数 mq_open() 会返回失败,不会创建消息队列.

    O_EXCL (既存检查)

    如果 O_EXCL 和O_CREAT同时被设置了, 如果消息队列应经存在,那么函数 mq_open() 会返回失败.
    提供了检查消息队列是否存在的方法, 如果设置了 O_EXCL 必须同时设置 O_CREAT 否则结果未定义.

    O_NONBLOCK (非阻塞)

    决定函数 mq_send() 和 mq_receive() 在获取当前无法获得的资源或消息时,是一直等待(阻塞), 还是返回失败并将 errno 设置成 [EAGAIN]; 

    RETURN VALUE

    如果函数执行成功, 函数返回一个描述符

    如果函数执行失败,函数返回 (mqd_t)-1 并且设置errno,errno的种别详见下面的ERRORS一节.

    ERRORS

    [EACCES]

    The message queue exists and the permissions specified by oflag are denied, or the message queue does not exist and permission to create the message queue is denied.

    [EEXIST]

    O_CREAT and O_EXCL are set and the named message queue already exists.

    [EINTR]

    函数 mq_open() 被信号中断.

    [EINVAL]

    函数 mq_open() 不支持参数name指定的路径.

    [EINVAL]

    设置了O_CREAT标志, 参数3 attr 不是NULL;并且 mq_maxmsg 或 mq_msgsize 小于等于0.

    [EMFILE]

    本进程中使用了过多的消息队列描述符 或 文件描述符.

    [ENFILE]

    系统中打开的消息队列数目超过了系统支持的最大数.

    [ENOENT]

    没有设置O_CREAT标志,并且指定的消息队列不存在.

    [ENOSPC]

    空间不足,无法创建新的消息队列.

    [ENAMETOOLONG]

    参数 name 的长度超过系统定义的最大长度.

    在不支持XSI系统中,name 的长度超过了 {_POSIX_PATH_MAX},在支持XSI系统中,name 的长度超过了 {_XOPEN_PATH_MAX};或者

    在不支持XSI系统中,某一级路径的长度超过了 {_POSIX_NAME_MAX},在支持XSI系统中,某一级路径的长度超过了 {_XOPEN_NAME_MAX};

    EXAMPLES

  • 相关阅读:
    java实现第七届蓝桥杯阶乘位数
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯打靶
    java实现第七届蓝桥杯打靶
    Mysql 查询一天中,每个小时数据的数量
    mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
  • 原文地址:https://www.cnblogs.com/LubinLew/p/POSIX-mq_open.html
Copyright © 2011-2022 走看看