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)
最后更新:2017-04-03 12:56:03
上一篇:
NULL, 0, 空格与'0','\0'
下一篇:
Cocos2d-x 3.0 新特性体验-触摸事件处理机制
wordpress后台提示内存不足的解决办法
大中华地区(含港澳台)空气质量接口参加阿里云API as a Service 大赛?
Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
怎么估算空间利用率?新研发传感器分分钟搞定!
递归求阶乘
【usaco】4.4.2最小割集PROB Pollutant Control
Android 向多媒体数据库增加音频文件
OSS社区工具与插件全新升级
windows常用API函数
HTAP数据库 PostgreSQL 场景与性能测试之 5 - (OLTP) 空间应用 - 空间包含查询