01-System V消息队列
第46章 System V消息队列
本章介绍System V消息队列。消息队列允许进程以消息的形式交换数据。尽管消息队列在某些方面与管道和FIFO类似,但它们之间仍然存在显著的差别。
- 用来引用消息队列的句柄是一个由msgget()调用返回的标识符。这些标识符与UNIX系统上大多数其他形式的I/O所使用的文件描述符是不同的。
- 通过消息队列进行的通信是面向消息的,即读者接收到由写者写入的整条消息。读取一条消息的一部分而让剩余部分遗留在队列中或一次读取多条消息都是不可能的。这一点与管道不通,管道提供的是一个无法进行区分的字节流(即使用管道时读者一次可以读取任意数量的字节数,不管写者写入的数据块的大小是什么)。
- 除了包含数据之外,每条消息还有一个用整数表示的类型。从消息队列中读取消息既可以按照先入先出的顺序,也可以根据类型来读取消息。
本章最后(46.9节)将会对System V消息队列所存在的限制进行总结。由于存在这些限制,因此新应用程序应该尽可能避免使用System V消息队列,而应该使用其他形式的IPC机制,如FIFO、POSIX消息队列以及socket。但在消息队列一开始被设计出来的时候,这些候选机制不是还没有被发明出来就是还没有在UNIX实现中被广泛采用,其结果是存在各类使用消息队列的既有应用程序,这也是在这里对消息队列进行介绍的主要原因之一。