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