您的位置:首页 > 其它

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

2016-02-01 14:22 405 查看

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


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

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <mqueue.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include <errno.h>
9
10 #define MQ_NAME ("/tmp")
11 #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
12 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限
13
14 int main()
15 {
16     mqd_t posixmq;
17     int rc = 0;
18
19     struct mq_attr mqattr;
20
21     // 创建默认属性的消息队列
22     posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
23     if(-1 == posixmq)
24     {
25         perror("创建MQ失败");
26         exit(1);
27     }
28
29     // 获取消息队列的默认属性
30     rc = mq_getattr(posixmq, &mqattr);
31     if(-1 == rc)
32     {
33         perror("获取消息队列属性失败");
34         exit(1);
35     }
36
37     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
38     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
39     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
40     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
41
42     rc = mq_close(posixmq);
43     if(0 != rc)
44     {
45         perror("关闭失败");
46         exit(1);
47     }
48
49     rc = mq_unlink(MQ_NAME);
50     if(0 != rc)
51     {
52         perror("删除失败");
53         exit(1);
54     }
55     return 0;
56 }


编译并执行:

1 root@linux:/mnt/hgfs/C_libary# gcc -o attrmq attrmq.c -lrt
2 root@linux:/mnt/hgfs/C_libary# ./attrmq
3 队列阻塞标志位:0
4 队列允许最大消息数:10
5 队列消息最大字节数:8192
6 队列当前消息条数:0
7 root@linux:/mnt/hgfs/C_libary#


设置消息队列的属性:

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <mqueue.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include <errno.h>
9
10 #define MQ_NAME ("/tmp")
11 #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
12 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限
13
14 int main()
15 {
16     mqd_t posixmq;
17     int rc = 0;
18
19     struct mq_attr mqattr;
20
21     // 创建默认属性的消息队列
22     mqattr.mq_maxmsg = 5; // 注意不能超过系统最大限制
23     mqattr.mq_msgsize = 8192;
24     //posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
25     posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr);
26
27     if(-1 == posixmq)
28     {
29         perror("创建MQ失败");
30         exit(1);
31     }
32
33     mqattr.mq_flags = 0;
34     mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw
35
36     // 获取消息队列的属性
37     rc = mq_getattr(posixmq, &mqattr);
38     if(-1 == rc)
39     {
40         perror("获取消息队列属性失败");
41         exit(1);
42     }
43
44     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
45     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
46     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
47     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
48
49     rc = mq_close(posixmq);
50     if(0 != rc)
51     {
52         perror("关闭失败");
53         exit(1);
54     }
55
56     rc = mq_unlink(MQ_NAME);
57     if(0 != rc)
58     {
59         perror("删除失败");
60         exit(1);
61     }
62
63     return 0;
64 }


编译运行:

1 root@linux:/mnt/hgfs/C_libary# gcc -o setattrmq setattrmq.c -lrt
2 root@linux:/mnt/hgfs/C_libary# ./setattrmq
3 队列阻塞标志位:0
4 队列允许最大消息数:5
5 队列消息最大字节数:8192
6 队列当前消息条数:0


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: