Linux文件共享(六)——描述符传递-阿里云开发者社区

开发者社区> 开发与运维> 正文

Linux文件共享(六)——描述符传递

简介:

注:转载请注明出处   作者: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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章