在UNIX网络编程:卷2-进程间通信中的一个例子如下:
#include <mqueue.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
int main(int argc, char **argv) {
int c, flags;
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) {
printf("usage: mqcreate [ -e ] <name>\n");
exit(1);
}
mqd = mq_open(argv[optind], flags, FILE_MODE, NULL);
if (mqd == -1) {
printf("mq_open error:%s %s\n", argv[optind],strerror(errno));
exit(1);
}
mq_close(mqd);
return 0;
}
编译:
$:gcc mqcreate.c -omqcreate -lrt
执行:$:./mqcreate -e /temp.1234
提示:mq_open error:/test.1234 Permission denied
通过man 7 mq_overview可以查看到:
在Linux上,消息队列是通过一个虚拟文件系统创建(其他系统也可能提供了一个类似的实现)。这个文件系统可以通过以下命令被挂载(root权限):
#mkdir /dev/mqueue
#mount -t mqueue none /dev/mqueue
mq_open的name被自动设置在挂载目录(/dev/mqueue)。
在文件系统被挂载后,消息队列就可以在系统上通过例如ls和rm这样的命令查看,操作。
按照上面描述,挂载/dev/mqueue目录后,就解决了。