17.1 引言
*两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)可以在进程间传送打开文件描述符。服务进程可以使它们的打开文件描述符与指定的名字相关联,客户进程可以使用这些名字与服务进程通信
17.2 基于STREAMS的管道
*可以用fattach函数给STREAMS管道一个文件系统中的名字
*一旦STREAMS管道连接到文件系统名字空间,那么原来该名字的底层文件就不再可访问的。打开改名字的任一进程将能访问相应管道,而不是访问原先的文件。在调用fattach之前打开底层文件的任一进程可以继续访问该文件
*虽然fattach函数可将任何种类的STREAMS文件描述符与文件系统中的一个名字相连接,但它最主要用于将一个名字给予一STREAMS管道
*在调用fdetach函数之后,先前依靠打开path而能访问STREAMS管道的进程仍可继续访问该管道,但是在此之后打开path的进程将访问驻留在文件系统中的底层文件
17.3 UNIX域套接字
*UNIX域套接字用于在同一台机器上运行的进程之间的通信
*UNIX域套接字提供流和数据包两种接口
*当我们将一地址绑定至UNIX域套接字时,系统用该路径名创建一类型为S_IFSOCK的文件。该文件仅用于向客户进程告知套接字名字。该文件不能打开,也不能由应用程序用于通信。如果当我们试图绑定地址时,该文件已经存在,那么bind请求失败。当关闭套接字时,并不自动删除该文件,所以我们必须确保在应用程序终止前,对该文件执行解除链接操作
17.4 传送文件描述符
*当一个进程(通常是服务器进程)希望将一个描述符传送给另一个进程时,它调用send_fd或send_err,等待接收描述符的进程(客户进程)调用recv_fd
17.5 open服务器版本1
*使用文件描述符传送技术,我们开发了一个open服务器:一个由一个进程执行以打开一个或几个文件的程序。该服务器不是将文件内容送回调用进程,而是送回一个打开文件描述符。这使该服务器对任何类型的文件(例如一个设备或套接字)而不单是普通文件都能起作用。这也意味着,用IPC交换了最小量的信息——从客户进程到服务器进程传送文件名和打开模式,而从服务器进程到客户进程返回描述符。文件内容不需用IPC传送
17.6 open服务器版本2
*open服务器版本2是一个以守护进程方式运行的open服务器。用一个服务器进程处理所以客户进程的请求。这一设计应该更加有效,因为没有使用fork和exec