UNIX系统中的进程间通信详解
1. 进程间通信概述
在UNIX系统里,进程间通信(IPC)机制能让两个或更多不同的进程相互交流。之前提到过一种IPC形式——管道,它允许两个相关进程(其中一个必须是另一个的子进程)通过读写系统调用,在双向字节流上进行通信。
较新的UNIX版本(如从4.2BSD开始的伯克利版本和System V)提供了更强大的IPC功能,能让两个或更多完全不相关的进程相互通信。System V提供了三种独立的IPC形式:信号量、共享内存和消息队列。虽然这些机制在各自领域很强大,但在使用类型上有一定限制。而伯克利UNIX的套接字方法,为大多数UNIX程序员熟悉的管道机制提供了一个通用接口,实际上,管道机制在伯克利UNIX中就是通过一对连接的套接字实现的。下面先介绍伯克利UNIX的方法,因为它更容易理解。
2. 伯克利UNIX的IPC
超出管道机制范围的进程间通信通常可以用客户端/服务器模型来描述。在这个模型中,一个进程被称为服务器,负责满足另一个进程(客户端)的请求。例如,管理机器上所有打印机队列的程序就是服务器。当用户打印文件时,打印程序(客户端)会联系服务器,请求将文件放入指定打印机的队列中,服务器完成此操作后,调用相应程序在打印机上实际打印文件。
服务器程序启动时,会向操作系统请求一个套接字。获得套接字后,它会给这个套接字分配一个知名名称,这样其他程序就可以通过这个名称与操作系统通信(因为它们不知道套接字的整数值)。命名后,服务器会监听套接字,等待客户端进程的连接请求。当连接请求到来时,服务器可以接受或拒绝该连接。如果接受,操作系统会在套接字处将客户端和服务器连接起来,服务器就可以像使用管道一样对套接字进行读写操作。