Posix消息队列
每个消息队列有一个保存其当前打开着描述符数的引用计数器;
Posix消息队列至少具备随内核的持续性,这就是说,即使当前没有进程打开着某个消息队列,
该队列及其上的各个消息也将一直存在,直到调用mq_unlink并让它的引用计数到0以删除该队列为止。
每个消息队列有四个属性:
struct mq_attr {
long mq_flags; /*message queue flag: 0, O_NONBLOCK*/
long mq_maxmsg; /*max number of messages allowed on queue*/
long mq_msgsize; /*max size of a message(int bytes)*/
long mq_curmsgs; /*number of messages currently on queue*/
};
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <mqueue.h>
const int maxline=4096;
int main(int argc, char **argv) {
int c, flags;
char errbuff[maxline];
mqd_t mqd;
flags=O_RDWR | O_CREAT;
while((c=getopt(argc, argv, "e"))!=-1) {
switch(c) {
case 'e':
flags|=O_EXCL;
break;
}
}
if(optind != argc-1) {
fprintf(stderr, "mqcreate [-e] <name>\n");
exit(-1);
}
printf("optind: %d, %s\n", optind, argv[optind]);
if((mqd=mq_open(argv[optind], flags, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, NULL))<0) {
strerror_r(errno, errbuff, maxline);
fprintf(stderr, "mq_open error: %s\n", errbuff);
exit(-1);
}
mq_close(mqd);
exit(0);
}
消息队列创建的位置默认在/dev/mqueue/
$ ./a.out -e /test optind: 2, /test $ cd /dev/mqueue/ $ ls -l total 0 -rw-r--r--. 1 dmin dmin 80 Oct 11 11:23 test $ cat test QSIZE:0 NOTIFY:0 SIGNO:0 NOTIFY_PID:0
获取消息队列属性
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mqueue.h>
int main(int argc, char **argv) {
mqd_t mqd;
struct mq_attr attr;
if(argc!=2) {
fprintf(stderr, "usage: ./a.out <name>\n");
exit(-1);
}
mqd = mq_open(argv[1], O_RDONLY);
mq_getattr(mqd, &attr);
printf("max #msgs=%ld, max #bytes/msg=%ld, #currently on queue=%ld\n", attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);
mq_close(mqd);
exit(0);
}
结果如下:
$ ./mqgetattr /test max #msgs=10, max #bytes/msg=8192, #currently on queue=0
浙公网安备 33010602011771号