Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3892229
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8585
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: LINUX

2011-12-03 16:28:11


   前段时间学习线程读写锁,找资料就找到了STEVENS老爷子的UNP2,虽然对UNP2 仰慕已久,始终没有买来一读,总是看电子书。本周买了本UNP2 IPC,开始看下。

   对system V的消息队列,有一定的了解,但是对于POSIX的消息队列,并不熟悉。所以看了书的第五章,补习一下。看书看的很快,觉得自己都掌握了,可是今天照抄了书上的一段程序,愣是看不到生成的消息队列在哪里。上网上找了资料,解决了这个问题。

   正所谓 纸上得来终觉浅,绝知此事要躬行。记录下来,让后来者少走弯路,也防止自己忘记。

    man mq_overviwe 可以看到,linux对POSIX消息队列的支持是有自己特点的。linux下POSIX 消息队列是建在VFS下的。英文好的同学可以阅读下。

    要想看到创建的posix消息队列,需要执行以下操作:
  1.            # mkdir /dev/mqueue
  2.            # mount -t mqueue none /dev/mqueue

OK,我们可以看下我们创建删除的posix消息队列函数,以及效果。基本是照抄的UNP2的,版权归STEVENS老爷子.

  1. #include<mqueue.h>
  2. #include<stdio.h>
  3. #include<sys/stat.h>
  4. #include<stdlib.h>
  5. #include<unistd.h>
  6. #include<errno.h>


  7. int main(int argc,char *argv[])
  8. {
  9.         int c,flags;
  10.         mqd_t mqd;
  11.         flags = O_RDWR|O_CREAT;

  12.         while((c=getopt(argc,argv,"e")!=-1))
  13.         {
  14.                 switch(c)
  15.                 {
  16.                      case 'e':
  17.                         flags |= O_EXCL;
  18.                         break;
  19.                 }
  20.         }

  21.         if(optind!=argc-1)
  22.         {
  23.              fprintf(stderr,"usage:mqcreate [-e] \n");
  24.              return -1;
  25.         }

  26.         mqd = mq_open(argv[optind],flags,S_IRUSR|S_IWUSR,NULL);
  27.         if(mqd == -1)
  28.         {
  29.              fprintf(stderr,"mq_open failed %d->%s\n",
  30.                              errno,strerror(errno));
  31.              return -2;
  32.         }
  33.         mq_close(mqd);


  34.     return 0;
  35. }
  1. #include<stdio.h>
  2. #include<sys/stat.h>
  3. #include<sys/msg.h>
  4. #include<stdlib.h>
  5. #include<errno.h>

  6. int main(int argc,char **argv)
  7. {
  8.         if(argc != 2)
  9.         {
  10.                 fprintf(stderr,"usage mqunlink \n");
  11.                 return -1;
  12.         }

  13.         int ret = mq_unlink(argv[1]);
  14.         if(ret != 0)
  15.         {
  16.              fprintf(stderr,"mq_unlink failed %d:%s",
  17.                              errno,strerror(errno));
  18.              return -2;
  19.         }

  20.         return 0;
  21. }
注意编译的时候,一定要加 -lrt选项,否则会报错。
执行之前,先看下/dev/mqueue
  1. root@libin:~/program/C/IPC# ll /dev/mqueue/
  2. 总用量 0
  3. drwxrwxrwt 2 root root 40 2011-12-03 23:42 ./
  4. drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
执行./mqcreate /abcd,然后再次查看/dev/mqueue
  1. root@libin:~/program/C/IPC# ./mqcreate /abcd
  2. root@libin:~/program/C/IPC# ll /dev/mqueue/
  3. 总用量 0
  4. drwxrwxrwt 2 root root 60 2011-12-03 16:01 ./
  5. drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
  6. -rw------- 1 root root 80 2011-12-03 16:01 abcd

 我们传入一个名字,然后生成消息队列,注意这个名字是有要求的。
1 / 打头
  1. root@libin:~/program/C/IPC# ./mqcreate ab/cd
  2. mq_open failed 22->Invalid argument
2 有且只有一个/,
  1. root@libin:~/program/C/IPC# ./mqcreate /a/b
  2. mq_open failed 13->Permission denie
3 文件名尽量不要太长吧。因为有长度限制。这个到底支持多长我没有测试出来,
因为网上有人说不要超过14字节,但是我测试的结果,是允许超过14字节的。
  1. libin@libin:~$ ll /dev/mqueue/
  2. 总用量 0
  3. drwxrwxrwt 2 root root 200 2011-12-03 16:22 ./
  4. drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
  5. -rw------- 1 root root 80 2011-12-03 16:01 abcd
  6. -rw------- 1 root root 80 2011-12-03 16:20 abcdefghijklmn
  7. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmno
  8. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop
  9. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq
  10. -rw------- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd
  11. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst
  12. -rw------- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz
最后执行下删除:

  1. root@libin:~/program/C/IPC# ./mqunlink /abcd
  2. root@libin:~/program/C/IPC# ll /dev/mqueue/
  3. 总用量 0
  4. drwxrwxrwt 2 root root 180 2011-12-03 16:31 ./
  5. drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../
  6. -rw------- 1 root root 80 2011-12-03 16:20 abcdefghijklmn
  7. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmno
  8. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop
  9. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq
  10. -rw------- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd
  11. -rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst
  12. -rw------- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz
要想了解对长度的限制,还是要深入到内核源码层面才能理解,我的水平还是不行,需要继续学习。
参考文献:
1 UNP2 IPC



阅读(8659) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

Heartwork2011-12-05 16:40:30

在《UNIX操作系统设计》里提到过这个问题:
目录文件的结构是以16字节为一条记录(被叫做目录项),开始的两个字节为索引节点值,后面的14字节是文件名。

现在的Linux/Unix系统已经摆脱了这种限制。