【IPC通訊】Posix消息隊列的屬性設置

Posix消息隊列的屬性使用以下結構存放:shell

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 。spa

#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;
}

 編譯並執行:code

[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  任洪彩  qdurenhongcai@163.com隊列

轉載請註明出處。get

相關文章
相關標籤/搜索