进程间通信机制:FIFOs与System V IPC详解
1. FIFOs概述
在进程间通信(IPC)中,管道是一种简单、灵活且高效的机制,但它存在一个主要缺点:无法打开已存在的管道。这使得任意两个进程难以共享同一管道,除非该管道由它们的共同祖先进程创建。
例如,数据库引擎服务器持续轮询客户端进程以接收查询请求,并将查询结果返回给客户端。虽然每次服务器与客户端的交互可以通过管道处理,但客户端进程通常由命令行外壳按需创建,导致服务器和客户端进程难以共享管道。
为解决这一限制,Unix系统引入了一种特殊文件类型——命名管道(Named Pipe),即FIFO(First In, First Out)。写入FIFO的第一个字节也是最先被读取的字节。与管道类似,打开的FIFO不占用文件系统中的磁盘块,而是关联一个内核缓冲区,用于临时存储两个或多个进程交换的数据。
得益于磁盘索引节点(inode),FIFO的文件名包含在系统目录树中,因此每个进程都可以访问它。在上述数据库示例中,可以使用FIFOs替代管道来轻松建立服务器与客户端之间的通信。服务器在启动时创建一个FIFO,供客户端程序发送请求;每个客户端程序在建立连接前创建另一个FIFO,服务器将查询结果写入该FIFO,并将其名称包含在初始请求中发送给服务器。
在Linux 2.6中,FIFOs和管道几乎相同,使用相同的pipe_inode_info结构。实际上,FIFO的读写文件操作方法由pipe_read()和pipe_write()函数实现,与管道的读写操作相同。不过,二者有两个显著区别: