注:转载请注明出处 作者:lvyilong316
5.1 进程间描述符传递
首先,我们先来讨论一个问题——进程间传递文件描述符究竟传递的是什么?
我们从传递描述符函数的参数来看是个fd,我们知道fd是打开文件指针的在数组中的下标,是一个整数,那么我们仅仅是把一个整数传递给另一个进程吗?答案肯定是否定的,因为仅仅是传递整数值,没有必要专门去实现一个api。至于深层次的的原因,我们可以想一下,假如接受进程仅仅收到的是一个整数值,他能知道什么,又能做什么呢?即使它知道这是来自另一个进程的一个打开文件指针的下标,可是它还是不能知道这个下标在另一个进程中对应的是哪个打开文件,其次,这个下标对接收进程本身毫无意义,因为在接受进程中这个下标(fd)可能已经被其他打开文件占用。
我们又知道当我们将一个文件描述符传递给另一个进程后,文件的“访问计数”会增加,这和什么有点像?没错,dup。对于进程间传递文件描述符我们可以看作跨进程的dup调用,也就是同一个file对象在不同进程间的映射,这和两个进程打开同一个文件的结果相同,只是接受文件描述符的进程少了open的步骤而已,而对于网络接口返回的描述符,也只能采取传递文件描述符的方法。unix 系统中有两个办法来完成这个任务:
BSD sendmsg, recvmsg 方法。
SYSV ioctl 方法。
当一个进程向另一个进程传送一打开的文件描述符时,我们想要发送进程和接收进程共享同一文件表项。下图显示了所希望的安排。
总结:进程间文件描述符的传递,只是通过内核将接收文件的一个新的file指针指向和发送进程的同一个file对象,并使这个file对象的引用计数增加。
5.2 线程间描述符传递
通过上一节分析线程间文件共享,我们可以知道每个线程的同一个file指针下标,对应同一个file对象,同一个文件在一个线程中是什么状态,在另一个线程(同一进程中)也是什么状态。所以线程间不需要传递文件描述符,或者说仅仅通过fd值的传递即可达到传递描述符的效果(内核无需干预)。
Linux文件共享总结:共享程度:
1.线程共享(共享files_struct结构)
2.进程间描述符传递、dup、父子进程共享打开文件(共享file对象)
3.两独立进程打开同一文件(共享dentry)