您的位置:首页 > 其它

文件描述符

2015-12-03 21:38 246 查看
首页

开源项目

问答

代码

博客

翻译

资讯

移动开发

招聘

城市圈

当前访客身份:游客 [ 登录 | 加入开源中国 ]

当前访客身份: 游客 [ 登录 | 加入开源中国 ]

软件

 



Iuranus

 关注此人

关注(2) 粉丝(11) 积分(53)

穷则独善其身,达则兼济天下。 另一个博客:http://www.cnblogs.com/iuranus/
.发送私信.请教问题

博客分类
Java(15)
Python(6)
Linux/Shell(10)
Hadoop/Hive(2)
Databases(4)
Android(1)
HTML5/CSS(1)
Other(1)

阅读排行
1. 新浪微博开放平台提交审核时android签名生成
2. 比较好用的XShell配色方案
3. MyEclipse10安装PyDev插件
4. 关于Mongodb启动服务时1067错误的解决方法
5. 从搭建Nexus到建立Maven项目
6. 文件句柄、文件描述符与进程和多线程的那些事
7. PYTHON多线程处理文件
8. 对MongoDB中MongoClient类的吐槽

最新评论

@Iuranus:引用来自“zigzagroad”的评论一个Tomcat下部署多... 查看»

@zigzagroad:一个Tomcat下部署多个项目时,相同的jar包(比如... 查看»

@Iuranus:引用来自“秋野001”的评论 再加个编码自动判断呗... 查看»

@秋野001:再加个编码自动判断呗 查看»

@Iuranus:引用来自“许雷神”的评论支持 查看»

@许雷神:支持 查看»

@WhiteWater:的确是这个问题。 查看»

@Iuranus:引用来自“秋野001”的评论 很有意思的讲解,谢谢... 查看»

@秋野001:很有意思的讲解,谢谢楼主。 查看»

访客统计
今日访问:125
昨日访问:136
本周访问:507
本月访问:389
所有访问:27988

空间 » 博客
» 
Linux/Shell
Java
Python
Hadoop/Hive
Databases
Android
HTML5/CSS
Other
所有分类


原 文件句柄、文件描述符与进程和多线程的那些事

发表于1年前(2014-10-14 11:21)   阅读(2243) | 评论(0) 10人收藏此文章, 我要收藏

赞0

12月12日北京OSC源创会 —— 开源技术的年终盛典 »  


摘要 接着昨天的Python多线程读操作文件的讨论http://my.oschina.net/iuranus/blog/330281,这次再学习下文件句柄、文件描述符与进程和多线程的那些事。
文件句柄 文件描述符 多线程 操作系统

传送门:PYTHON多线程处理文件

文件句柄(摘抄的一些概念,帮助理解):

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

句柄是操作系统在生成对象时分配给对象的唯一标识。 通过句柄可以获取操作系统提供的服务。句柄不同于指针,如果你得到一个对象的指针,那你就可以在此对象上为所欲为了。于是系统不给你指针,而给用户一个加了限制的,用于跟踪对象的指针的标识——句柄。系统使用句柄向外提供服务就相对安全了。

总结:

1、无论是文件句柄(Windows中概念),还是文件描述符(linux中概念),其最终目的都是用来定位打开的文件在内存中的位置,只是它们映射的方式不一样。

2、文件句柄定位到的是文件对象,而非文件。而文件对象是对这个文件的一些状态、属性的封装,例如读取到的文件位置等。

3、关于在进程、线程下,这个时候用文件句柄不好阐述,可以把文件句柄理解成下图中的文件描述符,如下图:





每个进程有各自独立的文件描述符,打开不同的文件也都会有不同的打开文件表项,并且指向不同的v-node表项。

此时没有共享文件,并且每个描述符对应一个不同的文件。





不同的进程多次open一个文件,则会产生不同的打开文件表项,但最终指向的是同一个文件的v-node标项。

此时,多个描述符也可以通过不同的文件表表项来引用同一个文件。例如,如果以同一个filename调用open函数两次,就会发生这种情况。关键思想是:每个描述符都有它自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据。

如果在多线程中打开同一个文件(不同于在主线程中打开一个文件,并将fd=open(file)的fd参数传给线程),则每个线程会有各自的文件描述符,按照上一条关键思想,这每个线程也会有保存自己的读取位置,互不影响。

深入理解计算机系统里还有这么段话:因为每个进程都有自己HANDLE的存储空间);如果是同一个进程的线程,因为同基于I/O多路复用的流一样,多个线程运行在单一进程的上下文中,共享这个进程虚拟地址空间的整个内容,包括它的代码、数据、堆、共享库和打开的文件(句柄)。这个应该也是指的进程已经打开文件,则线程共享打开的文件。





如果在调用fork之前父进程已经打开文件,则fork后子进程有一个父进程描述符表的副本。父子进程共享相同的打开文件集合,因此共享相同的文件位置。

这个情况跟主线程已经open文件,并把fd传给启动的线程的情况是一样的。

另外关注上述图片表的解释如下:





这下清楚不少,但是昨天关于Python中myFile = open('fileLoc','r')的情况还不能照搬理解,因为Python的封装,open后返回的是文件对象,至于文件对象的本质,还需要进一步研究。

感谢秦师兄、自习室二期小伙伴们的热烈讨论。

上述内容如果与事实有出入,请一定提出异议。





分享到: 

 

0赞

声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。

« 上一篇

下一篇 »

最新热门职位
更多开发者职位上 开源中国·招聘





java开发工程师 大麦网

月薪: 15-25K






Java开发工程师-技术与... 京东金融

月薪: 15-30K




Java开发工程师 迪原创新

月薪: 8-15K






Java开发工程师实习生-... 京东金融

月薪: 2-3K



评论0



发表评论插入: 表情 开源软件

关闭相关文章阅读
2013/06/08文件描述符和df的一个有趣的问题
2010/12/21linux中的文件描述符
2015/04/16shell中的文件描述符指定文件及使用...
2012/11/28增加Linux最大打开文件数/文件描述符...
2014/01/03查看进程所占文件句柄

© 开源中国(OSChina.NET) | 关于我们 | 广告联系 | @新浪微博 | 开源中国手机版 | 粤ICP备12009483号-3开源中国手机客户端:AndroidiPhoneWP7
开源中国社区(OSChina.net)是工信部 开源软件推进联盟 指定的官方社区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: