IPC通信:Posix消息队列的属性设置
2012-04-16 09:29
525 查看
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; }
编译并执行:
root@linux:/mnt/hgfs/C_libary# gcc -o attrmq attrmq.c -lrt root@linux:/mnt/hgfs/C_libary# ./attrmq 队列阻塞标志位:0 队列允许最大消息数:10 队列消息最大字节数:8192 队列当前消息条数:0 root@linux:/mnt/hgfs/C_libary#
设置消息队列的属性:
#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; }
编译运行:
root@linux:/mnt/hgfs/C_libary# gcc -o setattrmq setattrmq.c -lrt root@linux:/mnt/hgfs/C_libary# ./setattrmq 队列阻塞标志位:0 队列允许最大消息数:5 队列消息最大字节数:8192 队列当前消息条数:0
相关文章推荐
- IPC通信:Posix消息队列的属性设置
- 【IPC通信】Posix消息队列的属性设置
- IPC通信:Posix消息队列的属性设置
- IPC通信:Posix消息队列
- IPC通信:Posix消息队列读,写
- IPC通信:Posix消息队列的属性设置
- IPC通信:Posix消息队列的创建,关闭,删除
- IPC通信:Posix消息队列读,写
- IPC通信:Posix消息队列
- Linux进程通信之POSIX消息队列
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- Linux进程通信IPC--消息队列MessageQueue
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- UNIX IPC: POSIX 消息队列
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- Linux进程通信之POSIX消息队列
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
- linux进程通信:使用posix消息队列mq进行线程或进程间的通信
- Unix IPC之Posix消息队列(3)