Unix系统支持在不同进程间共享打开文件
内核使用3种数据结构表示打开文件,这三种结构的关系决定了共享文件进程间的可能产生的影响
结构1.文件描述符表,文件描述符表存在于进程表的一个记录项中,文件描述符表中的每一项包含两个重要数据:
a. 文件描述符标志
b.指向一个文件表项的指针
结构2. 文件表项,文件表项存在于内核为所有打开文件维持的一张文件表中(注意该文件表不属于任何一个进程,它被所有进程公用)文件表项中包含的内容有:
a。文件状态标志(读,写,添加,同步和非阻塞等)
b。当前文件偏移量
c。指向该文件V节点表项的指针(v节点表项中存有该打开文件的更详细信息)
结构3. V节点结构,每个打开文件都有一个V节点结构(一个文件只有一个V节点,与打开她的进程个数无关)。V节点结构包含了文件类型和对此文件进行各种操作的函数指针。对于大多数文件,V节点还包含了一个i节点(索引节点)。以上这些信息都是在打开文件时从磁盘中读入内存的。i节点包含了文件的所有者,文件长度,指向文件实际数据块在磁盘所在位置的指针等必要信息
不同进程间的文件共享:
不同进程对文件的操作的不同体现在文件状态标志以及当前文件偏移量上,这些属性都在文件表项结构中。所以对于打开同一文件的不同进程,它们有各自的文件表项,但各自的文件表项的V节点指针却指向同一节点(前面说过,一个文件有且仅有一个V节点)。
由于不同进程最终都操作同一V节点,在大家都以读形式操作时没有任何问题,但关于不同进程间的写操作就可能会出现一些意想不到的结果,因此就需要进行进程间通信来同步两个进程的操作。由此引出了进程间通信的问题
以上图片摘自网络,与《UNIX环境高级编程》有出入,仅供参考