- 论坛徽章:
- 0
|
本帖最后由 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移动,,那么就会产生竞争了。。
自己想想看 |
|