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