#include<mqueue.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define FILE_MODE ((S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
struct mq_attr attr;
int main(int argc, char **argv)
{
int c, flags;
mqd_t mqd;
flags = O_RDWR | O_CREAT;
while((c = getopt(argc, argv, "em:z:")) != -1)
{
switch(c
{
case 'e':
flags |= O_CREAT;
break;
case 'm':
attr.mq_maxmsg = atol(optarg);
break;
case 'z':
attr.mq_msgsize = atol(optarg);
break;
}
}
if(optind != argc - 1)
{
printf("usage: mqcreate [-e] [-m maxmsg -z msgsize] <name>");
exit(EXIT_FAILURE);
}
if(attr.mq_maxmsg != 0 && attr.mq_msgsize == 0 ||
(attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))
{
printf("must specify both -m maxmsg and -z msgsize");
exit(EXIT_FAILURE);
}
mqd = mq_open(argv[optind], flags, FILE_MODE, NULL);
mq_close(mqd);
exit(0);
}
输入:
./mqcreate -e -m 1 -z 1 /demo19090400
输出:./mqgetattr /demo19090400
max #msg = 10, max #bytes/msg = 8192, #currently on queue = 0
注意:
- mq_xxx()函数不是标准库函数,所以链接时需指定库,通过在最后加上
-lrt
选项来指定。 - 程序运行之后可能会看不到消息队列,要看到创建的Posix消息队列,需执行以下操作:
- /需要在
/root/bin/
目录下创建创建消息队列
mkdir /dev/mqueue
mount -t mqueue none /dev/mqueue
/消息队列
ls -l /dev/mqueue
查看某个消息队列的属性./mqgetattr
#include<stdlib.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<mqueue.h>
int main(int argc, char **argv)
{
mqd_t mqd;
struct mq_attr attr;
if(argc != 2)
{
printf("usage: mqgetattr <name>\n");
exit(EXIT_FAILURE);
}
mqd = mq_open(argv[1], O_RDONLY);
if(mqd == -1)
{
printf("mq_open failed!\n");
exit(EXIT_FAILURE);
}
mq_getattr(mqd, &attr);
printf("max #msg = %ld, max #bytes/msg = %ld, "
"#currently on queue = %ld\n", attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);
int mq_cls = mq_close(mqd);
if(mq_cls == -2)
{
printf("mq_close failed!\n");
exit(EXIT_FAILURE);
}
exit(0);
}
参考:
https://blog.youkuaiyun.com/zx714311728/article/details/53197196#