前段时间学习线程读写锁,找资料就找到了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字节的。
最后执行下删除:
要想了解对长度的限制,还是要深入到内核源码层面才能理解,我的水平还是不行,需要继续学习。
参考文献:
1 UNP2 IPC
因为网上有人说不要超过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