Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59742
  • 博文数量: 20
  • 博客积分: 1031
  • 博客等级: 少尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-11 14:22
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(4)

2009年(14)

我的朋友

分类: LINUX

2010-10-11 20:04:02

前天(10.9)研究了很多共享内存的用法,当时就看到有两个版本的共享内存,一个是POSIX的(mmap),一个是System V(shmget)的;


然后今天又再看了消息队列的用法,也发现也有两种,一种是msgget(System V)的,一种是mq_open(POSIX)的。有人把它们分别作了归类,如下链接:(不保证是他原创的)

UNP--消息传递之System V消息队列
http://hi.baidu.com/jiangbeidou/blog/item/1371a5c63dc5d0d2d00060a2.html

UNP--消息传递之POSIX消息队列
http://hi.baidu.com/jiangbeidou/blog/item/61b6e5f50f224ad7f3d385a5.html


在APUE2里15.7最后面看到一句这样的话:

考虑到使用消息队列具有的问题(见15.6.4节),我们得出的结论是,在新的应用程序中不应当再使用它们。


它这里说的是msgget()的消息队列,感觉有点震惊了,竟然是这样的吗?

这是不是说可以使用POSIX的消息队列呢?


15.6.4节有这样的一些话:

XSI IPC的主要问题是:IPC结构是在系统范围内起作用的,没有访问计数。例如,某进程创建了一个消息队列,在该队列中放入几则消息后终止,该消息队列及其内容并不会被删除。要删除它们,必须这样:1、某个进程调用msgrcv读消息或msgctl删除消息队列;2、某个进程执行ipcrm命令删除消息队列;3、再启动系统删除消息队列。这样的做法与管道对比明显:当最后一个访问管道的进程终止时,管道也就被完全的删除了。...

XSI IPC的另一个问题是:这些IPC结构在文件系统中没有名字,我们不能用第3、4章所述的函数来访问它们或者修改它们的特性。为了支持它们不得不增加十几个新的系统调用(msgget、semop、shmat等)。我们不能用ls看到ipc对象,也不能用rm命令删除它们,也不能用chmod更改它们的访问权限,于是,就不得不增加ipcs和ipcrm。

因为这些IPC不使用文件描述符,所以不能对它们使用多路转接I/O函数:select和poll。...


15.6.1有一些值得记录的话:

1、无论何时创建IPC结构(msgget、segget、shmget),都应指定一个键,其数据类型为基本系统数据类型key_t,通常在头文件中被定义为长整型。键由内核变换成标识符。

2、注意,为了访问一个现存的IPC结构,决不能指定IPC_PRIVATE作为键,因为它总是用于创建一个新队列。

3、如果希望创建一个新的IPC结构,而且要确保不是引用具有同一标识符的一个现存的IPC结构,那么必须在flag中同时指定IPC_CREAT和IPC_EXCL位。这样,如果IPC结构已经存在就会造成出错,返回EEXIST(这与指定了O_CREAT和O_EXCL标志的open相类似)。



____消息队列____________________________________________________________

今天(10.12)又看了APUE2,其中的15.7的后面部分有一段关于 msgrcv 的值得记录的话:

ssize_t msgrcv (int msqid, void *ptr, size_t nbytes, long type, int flag);
返回值:若成功则返回消息的数据部分的长度,若出错则返回-1;
...

参数type使我们可以指定想要那一种消息:

type==0 返回队列的第一个消息;

type>0 返回队列中消息类型为type的第一个消息;

type<0 返回队列中消息类型值小于等于type绝对值的消息,如果这种消息有若干个,则取类型值最小的消息;


这段话说明了type的重要性,也是我在接下来的程序设计中需要考虑的一个重点。

很高兴又多知道了一点编程知识 ^__^

附:
本以为msgrcv的返回值为ssize_t是弄错了,找了一下,在“/usr/include/sys/msg.h”看到它的声明确实是用的ssize_t类型。
是我孤陋寡闻了 :)


____消息队列____________________________________________________________

APUE2,15.7中间部分有这样一段话,也需要注意:

注意,对删除消息队列的处理不是很完善。因为对每个消息队列并没有设置一个引用计数器(对打开文件则有这种计数器),所以删除一个队列会造成仍在使用这一队列的进程在下次对队列进行操作时出错返回。(信号量也以同样的方式处理删除)。与之对比,删除一个文件时,要等到使用该文件的最后一个进程关闭了它的文件描述符后,才会删除文件中的内容。



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

chinaunix网友2010-10-14 17:32:19

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com