5、用于打开的服务进程版本1
通过传递文件描述符号,我们开发一个用于打开的服务进程,这个程序被一个进程执行来打开一个或者多个文件。但是服务进程不会将文件内容发送给调用进程,而是将一个被打开的文件描述符号发送给调用进程。这样服务进程可以工作在任何文件类型上面(例如套接字文件,设备文件等)而不仅仅是普通文件类型。这样通过IPC传输的数据也会最少,从客户到服务传递文件名称和文件打开模式,从服务到客户传递返回的文件描述符号;而文件的内容并不通过IPC进行传递。
将服务进程设计成为一个独立的可执行程序有许多的好处(像本节这样我们可以通过调用exec来进行执行,或者像下一节我们可以将它当做一个守护服务进程):
- 服务进程可以很容易地被客户进程连接上,就像使用库函数那样。我们并不是将服务硬编码到一个应用程序中,而是将它设计成为一个可以被其它者重用的通用工具。
- 如果我们想要修改服务进程,那么只会影响到一个程序。相反更新一个库函数可能会导致所有的调用这个库函数的应用程序更新(也就是通过连接编辑器重新连接),当然动态连接共享库可以简化这个过程。
- 服务程序可以做为一个set-user-id程序,这样可以给客户进程提供额外它不具备的权限。而库函数(或共享库函数)无法提供这样的功能。
客户进程创建一个s-pipe(stream-based pipe或者UNIX域套接字对)然后调用fork和exec执行服务程序,客户通过s-pipe发送请求,服务通过s-pipe响应请求。
我们在客户和服务之间定义如下应用程序协议:
- 客户进程用s-pipe给服务进程发送"open <pathname> <openmode>\0" 格式请求。
- <openmode>是十进制ASCII表示的数值,用于open函数第二参数,请求字串以null字节结束。
- 服务进程通过调用send_fd或者send_err将打开的文件描述符号或者错误返回。
下面是一个发送给父进程打开的文件描述符号的例子。后面我们会使用一个单个的守护进程服务的例子来修改这个程序,那里服务进程发送文件描述符号给一个完全没有关系的进程。
网友评论