一、传送文件描述符的基本概念
在系统中,进程间同步或者互斥原子性操作同一个文件时除了指定文件的路径之后,其实可以通过传送文件的文件描述符来实现
多进程操控通过一个文件,进行系统工业控制。
服务器通常利用该功能把传输文件描述符给子进程进行操作文件的一系列工作。
二、传输文件描述符的基本原理
其实传输文件描述符并不只是当当发送文件的描述符(也就是一个普通的句柄编号),这样是不行的,而且不同进程间的内存是相对
独立的单纯发送文件描述符是没有用的。其实在一个进程打开一个文件时,除了获取到了文件描述符之外,每一个进程都有自己的PCB
结构体,存放这自己打开的文件描述符的列表,其中每一个文件描述符都有自己对应的文件指针,而我们这里传输就是指向这个文件
的内存指针,当其他进程获取到了这个指针的时候也能对这个文件进程操作。这个指针即是指向实际文件在内存中的文件表。
如下图所示:
文件描述符传输的原理图:
三、案例实现思路
需要写两个示例程序,服务器和子进程(可以把它当初客户端),使用UNIX的本地主机网络协议(即UNIX域)进行连接传输,
本思路使用TCP传输层协议为例子。
服务器:
创建UNXI域类型的socket,UNXI域类型即称为:AF_LOCAL 或者 AF_UNIX
绑定套接字
监听套接字
等待子程序(客户端)连接
打开指定文件
发送文件的套接字
在文件中写入 service:fd send success\n
等待子程序接受完成后,sleep(4)关闭文件
关闭套接字
子程序(客户端)
创建UNXI域类型的socket,UNXI域类型即称为:AF_LOCAL 或者 AF_UNIX
连接服务器
接受服务器发送过来的文件描述符
接受完成之后,打开文件描述符对应的指定的文件,往指定的文件写入 client:recv fd success\n
发送flish给服务器
sleep(1)关闭文件
关闭套接字