免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1946 | 回复: 7
打印 上一主题 下一主题

文件描述符的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-25 21:51 |只看该作者 |倒序浏览

请教,关于文件描述符我是这么理解的:
如果是两个无亲缘关系进程分别打开同一个路径上的文件,则这两个进程各自有独立的文件上下文,  存在覆盖写的危险
如果两个父子进程因为继承的关系,共享同一个文件描述符, 因为他们对文件的写操作实际上走的是同一个描述符,所以理论上不会有覆盖写的危险

不知道这样理解对不对??


在LINUX环境编程版块里没有人理,只好发这儿了

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
2 [报告]
发表于 2012-05-25 21:56 |只看该作者
本帖最后由 ulovko 于 2012-05-26 09:08 编辑

Advanced Programming in the UNIX Environment

Advanced-Programming-in-the-UNIX-Environment2005.pdfab.zip (1.99 MB, 下载次数: 0)

Advanced-Programming-in-the-UNIX-Environment2005.pdfaa.zip (3.55 MB, 下载次数: 0)

  1. 使用方法:
  2. > unzip Advanced-Programming-in-the-UNIX-Environment2005.pdfaa.zip
  3. > unzip Advanced-Programming-in-the-UNIX-Environment2005.pdfab.zip
  4. > cat Advanced-Programming-in-the-UNIX-Environment2005.pdfa* >>unzip Advanced-Programming-in-the-UNIX-Environment2005.pdf
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-05-25 22:01 |只看该作者
恕我愚笨,没看懂你的回帖

ulovko 发表于 2012-05-25 21:56
你那个帖子其实我看了
http://www.linfo.org/main_index.html

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
4 [报告]
发表于 2012-05-25 22:02 |只看该作者
回复 3# chong232


    对这个不懂 帮你找了点资料

论坛徽章:
0
5 [报告]
发表于 2012-05-25 22:41 |只看该作者
多谢,这资料我没看明白。。。

回复 4# ulovko


   

论坛徽章:
0
6 [报告]
发表于 2012-05-25 23:42 |只看该作者
本帖最后由 fdl19881 于 2012-05-25 23:43 编辑

回复 5# chong232



    这个问题其实看下《UNIX环境高级编程》第3章的44页的图 和 第8章144页的图 就懂了。
先上图:



进程表      文件表      INODE
文件描述符是对应于各个进程的。不同进程的文件描述符对应的文件(或者socket等)可能不同
方件表和INODE与进程不是一一对应关系。

对于open打开的同一文件 ,得到的文件描述符 对应的文件表是“不同的”  , 但是对应的INODE是相同的
对于继承而来的文件描述符 , 他们对应的文件表是“相同的” , 对应的INODE也是相同的。 (dup函数也是这种情况)
文件表和INODE分别有各自的引用计数。 减为0才会真正的关闭。

进程描述符 《== 》进程表   包含了一个标志 : close_on_exec (这个标志是与文件描述符一一对应)
文件表 包括了 : RDONLY , WRONLY , RDWR , APPEND 还有 pos(位置)    (见源码结构体struct file,网上搜搜)
INODE 包括的:  文件的长度 , 类型(如普通文件,套接口等)   (见源码结构体struct inode , 网上搜搜)

所以这就好得出一般的结论了:
1. 对于使用open, 如果没有指定O_APPEND 的话, 确定会出现这种情况 , 因为文件他们的POS不同,每次write,都会导致INODE中的文件长度发生变化,从而发生覆盖等。
2. 对于继承得到的情况就不存在这种问题了。 因为文件描述符共用同一个文件表,他们共用文件表的打开模式,POS信息。 当然还包括INODE中的文件长度信息。 这种情况也会遇到问题, 比如A进程将其用lseek到一个位置,但是B进程也用了lseek移动,,那么就会产生竞争了。。


自己想想看

论坛徽章:
0
7 [报告]
发表于 2012-05-26 00:34 |只看该作者
fdl19881 发表于 2012-05-25 23:42
回复 5# chong232


谢谢,感觉我自己想的是对的。

其实提这个问题,是我对重定向概念有点混乱,我理解fd1重定向到fd2的实质就是fd1指到了fd2的文件表,或者就是fd1和fd2共享一个文件表?

论坛徽章:
0
8 [报告]
发表于 2012-05-26 00:55 |只看该作者
回复 7# chong232


    对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP