我们正在使用
设置消息队列属性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中的值是什么(默认值)?
答案 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或其他语言不同,变量没有默认值,因此您不能对变量中的内容有任何期望。