前段时间学习线程读写锁,找资料就找到了STEVENS老爷子的UNP2,虽然对UNP2 仰慕已久,始终没有买来一读,总是看电子书。本周买了本UNP2 IPC,开始看下。
对system V的消息队列,有一定的了解,但是对于POSIX的消息队列,并不熟悉。所以看了书的第五章,补习一下。看书看的很快,觉得自己都掌握了,可是今天照抄了书上的一段程序,愣是看不到生成的消息队列在哪里。上网上找了资料,解决了这个问题。
正所谓 纸上得来终觉浅,绝知此事要躬行。记录下来,让后来者少走弯路,也防止自己忘记。
man mq_overviwe 可以看到,linux对POSIX消息队列的支持是有自己特点的。linux下POSIX 消息队列是建在VFS下的。英文好的同学可以阅读下。
要想看到创建的posix消息队列,需要执行以下操作:
- # mkdir /dev/mqueue
-
# mount -t mqueue none /dev/mqueue
OK,我们可以看下我们创建删除的posix消息队列函数,以及效果。基本是照抄的UNP2的,版权归STEVENS老爷子.
- #include<mqueue.h>
-
#include<stdio.h>
-
#include<sys/stat.h>
-
#include<stdlib.h>
-
#include<unistd.h>
-
#include<errno.h>
-
-
-
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)
-
{
- fprintf(stderr,"usage:mqcreate [-e] \n");
-
return -1;
-
}
-
-
mqd = mq_open(argv[optind],flags,S_IRUSR|S_IWUSR,NULL);
-
if(mqd == -1)
-
{
- fprintf(stderr,"mq_open failed %d->%s\n",
- errno,strerror(errno));
-
return -2;
-
}
-
mq_close(mqd);
-
-
-
return 0;
-
}
- #include<stdio.h>
-
#include<sys/stat.h>
-
#include<sys/msg.h>
-
#include<stdlib.h>
-
#include<errno.h>
-
-
int main(int argc,char **argv)
-
{
-
if(argc != 2)
-
{
- fprintf(stderr,"usage mqunlink \n");
-
return -1;
-
}
-
-
int ret = mq_unlink(argv[1]);
-
if(ret != 0)
-
{
- fprintf(stderr,"mq_unlink failed %d:%s",
- errno,strerror(errno));
-
return -2;
-
}
-
-
return 0;
-
}
注意编译的时候,一定要加 -lrt选项,否则会报错。
执行之前,先看下/dev/mqueue
- root@libin:~/program/C/IPC# ll /dev/mqueue/
-
总用量 0
-
drwxrwxrwt 2 root root 40 2011-12-03 23:42 ./
-
drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
执行./mqcreate /abcd,然后再次查看/dev/mqueue
- root@libin:~/program/C/IPC# ./mqcreate /abcd
-
root@libin:~/program/C/IPC# ll /dev/mqueue/
-
总用量 0
-
drwxrwxrwt 2 root root 60 2011-12-03 16:01 ./
-
drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
-
-rw------- 1 root root 80 2011-12-03 16:01 abcd
我们传入一个名字,然后生成消息队列,注意这个名字是有要求的。
1 / 打头
- root@libin:~/program/C/IPC# ./mqcreate ab/cd
-
mq_open failed 22->Invalid argument
2 有且只有一个/,
- root@libin:~/program/C/IPC# ./mqcreate /a/b
-
mq_open failed 13->Permission denie
3 文件名尽量不要太长吧。因为有长度限制。这个到底支持多长我没有测试出来,
因为网上有人说不要超过14字节,但是我测试的结果,是允许超过14字节的。
- libin@libin:~$ ll /dev/mqueue/
-
总用量 0
-
drwxrwxrwt 2 root root 200 2011-12-03 16:22 ./
-
drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
-
-rw------- 1 root root 80 2011-12-03 16:01 abcd
-
-rw------- 1 root root 80 2011-12-03 16:20 abcdefghijklmn
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmno
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq
-
-rw------- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst
-
-rw------- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz
最后执行下删除:
- root@libin:~/program/C/IPC# ./mqunlink /abcd
-
root@libin:~/program/C/IPC# ll /dev/mqueue/
-
总用量 0
-
drwxrwxrwt 2 root root 180 2011-12-03 16:31 ./
-
drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
-
-rw------- 1 root root 80 2011-12-03 16:20 abcdefghijklmn
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmno
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq
-
-rw------- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd
-
-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst
-
-rw------- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz
要想了解对长度的限制,还是要深入到内核源码层面才能理解,我的水平还是不行,需要继续学习。
参考文献:
1 UNP2 IPC
阅读(8642) | 评论(1) | 转发(1) |