mq_attr结构的默认值

时间:2013-12-11 10:14:10

标签: c

我们正在使用

设置消息队列属性
int mq_setattr(mqd_t mqdes, struct mq_attr *newattr,
                        struct mq_attr *oldattr);

其中mq_attr由以下字段组成:

struct mq_attr {
               long mq_flags;       /* Flags: 0 or O_NONBLOCK */
               long mq_maxmsg;      /* Max. # of messages on queue */
               long mq_msgsize;     /* Max. message size (bytes) */
               long mq_curmsgs;     /* # of messages currently in queue */
           };

我在创建时的问题,如果我们没有设置属性,那么mq_attr中的值是什么(默认值)?

2 个答案:

答案 0 :(得分:2)

如果您未初始化struct mq_attr,但在执行mq_open时提供,则变量将包含未指定的内容。这意味着mq_attr可以具有随机值。

所以

struct mq_attr attr; //Will be uninitialized -> bad thing
q = mq_open("/mqtest",O_RDWR|O_CREAT,0660,&attr);

与往常一样,在C中,您需要在使用它们之前初始化变量。

您可以将属性的NULL传递给mq_open()以获取系统默认值。

您可以自己学习系统默认值。它们是系统相关的,默认值可以通过sysctls,资源限制或类似的方式进行调整。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <mqueue.h>


int main(int argc, char *argv[])
{
    struct mq_attr attr;
    /*
    struct rlimit limit;
    if(getrlimit(RLIMIT_MSGQUEUE,&limit) == -1) {
        perror("getrlimit");
        return 1;
    }
    printf("RLIMIT_MSGQUEUE cur = %ld,max = %ld\n",(long)limit.rlim_cur,(long)limit.rlim_max);
    */

    mqd_t q = mq_open("/mqtest",O_RDWR|O_CREAT,0660,NULL);
    if(q == -1) {
        perror("mq_open");
        return 1;
    }
    if (mq_getattr(q, &attr) == -1) {
        perror("mq_getattr");
        return 1;
    }
    printf("mq_flags %ld\n",  attr.mq_flags);
    printf("mq_maxmsg %ld\n", attr.mq_maxmsg);
    printf("mq_msgsize %ld\n",attr.mq_msgsize);
    printf("mq_curmsgs %ld\n",attr.mq_curmsgs);
    mq_close(q);
    mq_unlink("/mqtest");
    return 0;
}

注释掉的部分可以为你提供linux上队列中最大字节数的rlimit,用例如ulimit命令。

答案 1 :(得分:1)

这取决于编译器。但是在C中,与Java或其他语言不同,变量没有默认值,因此您不能对变量中的内容有任何期望。