【IPC通信】Posix消息队列的属性设置

Posix消息队列的属性使用如下结构存放:

struct mq_attr
{
    long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/
    long mq_maxmsg; /*队列所允许的最大消息条数*/
    long mq_msgsize; /*每条消息的最大字节数*/
    long mq_curmsgs; /*队列当前的消息条数*/
};

队列可以在创建时由mq_open()函数的第四个参数指定mq_maxmsg,mq_msgsize。 如创建时没有指定则使用默认值,一旦创建,则不可再改变。

队列可以在创建后由mq_setattr()函数设置mq_flags 。

#include <mqueue.h>
/*取得消息队列属性,放到mqstat地fh*/
int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);
/*设置消息队列属性,设置值由mqstat提供,原先值写入omqstat*/
int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat);
均返回:若成功则为0,若出错为-1

下面通过程序获取和设置消息队列的默认属性:

#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define MQ_NAME ("/tmp")
#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限

int main()
{
    mqd_t posixmq;
	int rc = 0;

    struct mq_attr mqattr;

    // 创建默认属性的消息队列
    posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
	if(-1 == posixmq)
	{
		perror("创建MQ失败");
		exit(1);
	}
    
    // 获取消息队列的默认属性
    rc = mq_getattr(posixmq, &mqattr);
    if(-1 == rc)
    {
        perror("获取消息队列属性失败");
        exit(1);
    }
    printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
    printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
    printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
    printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);

	rc = mq_close(posixmq);
	if(0 != rc)
	{
		perror("关闭失败");
		exit(1);
	}

	rc = mq_unlink(MQ_NAME);
	if(0 != rc)
	{
		perror("删除失败");
		exit(1);
	}

	return 0;
}

 编译并执行:

[infor@s123 PosixMq]$ gcc -o mqattr mqattr.c -lrt
[infor@s123 PosixMq]$ ./mqattr 
队列阻塞标志位:0
队列允许最大消息数:10
队列消息最大字节数:8192
队列当前消息条数:0

看下面如何设置:

#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define MQ_NAME ("/tmp")
#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限

int main()
{
    mqd_t posixmq;
	int rc = 0;

    struct mq_attr mqattr;

    // 创建默认属性的消息队列
	mqattr.mq_maxmsg = 5; // 注意不能超过系统最大限制
	mqattr.mq_msgsize = 8192;
    //posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
	posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr);
	if(-1 == posixmq)
	{
		perror("创建MQ失败");
		exit(1);
	}
	mqattr.mq_flags = 0;
	mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw
    
    // 获取消息队列的属性
    rc = mq_getattr(posixmq, &mqattr);
    if(-1 == rc)
    {
        perror("获取消息队列属性失败");
        exit(1);
    }
    printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
    printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
    printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
    printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);

	rc = mq_close(posixmq);
	if(0 != rc)
	{
		perror("关闭失败");
		exit(1);
	}

	rc = mq_unlink(MQ_NAME);
	if(0 != rc)
	{
		perror("删除失败");
		exit(1);
	}

	return 0;
}

编译并执行:

[infor@s123 PosixMq]$ gcc -o mqattr mqattr.c -lrt
[infor@s123 PosixMq]$ ./mqattr 
队列阻塞标志位:0
队列允许最大消息数:5
队列消息最大字节数:8192
队列当前消息条数:0

 

2011-11-16  任洪彩  [email protected]

转载请注明出处。

你可能感兴趣的:(c,消息队列,posix,IPC通信)