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

 

posted @ 2022-10-09 10:41  东宫得臣  阅读(98)  评论(0编辑  收藏  举报