快速业务通道

UNIX文件的共享

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-30

1.内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程的影响.

(1). 每个进程在进程表中都一个记录项(task_struct),包含一个打开文件描述符表(存放在用户空间).每个文件描述符为表中一项,包括文件描述符标识和指向一个文件表项的指针.

(2). 内核为所有打开文件维持一张文件表,每个文件表项包括:

a). 文件状态标识(RD, WR, APPEND, 同步和非阻塞等).注意,文件描述符作用域是一个进程,而文件状态标识则适用于指向文件表中该表项的所有进程的描述符.使用fcntl函数来修改这两个结构.下面第3节将会解释.

b). 当前文件偏移量

c). 指向该文件v节点表项的指针.

(3). 每个打开文件或设备都有一个v-node结构,包含文件类型和对此文件进行各种操作的函数的指针.对于大多数文件,v-node还包含了该文件的i-node节点(i-node包含文件所有者、长度、所在设备、指向文件数据库在磁盘上位置的指针等).这些信息是打开文件时从磁盘读入内存的,所有关于文件的信息都是快速可以使用的.

Linux没有使用v-node,而是使用了通用的i-node节点结构.虽然两者实现有所不同,但在概念上,v-node和i-node是一样的,都指向文件系统相关的i-node结构.

三张表的关系,进程表项有一个进程打开了标准输出(fd=0)和标准输入(fd=1)两个文件.task_struct结构的打开文件描述符表中有这两项(每项包含fd标志和文件指针),其中文件指针指向文件表(每项包含文件状态标志,当前文件偏移量和v-node指针),其中v-node指针指向v-node节点表(每项包含v-node info, i-node info&当前文件长度等).Linux没有将相关数据结构分为i-node和v-node,而是使用一个独立于文件系统的i-node和一个依赖文件系统的i-node.

如果两个进程打开了同一个文件,则该文件在文件表中有两项,这样可以记录每个进程对该文件的当前偏移量.但是v-node项中只有一项.在完成每个write操作后,在文件表项中当前文件偏移量即增加所写的字节数.如果文件偏移量超过了文件长度,则文件长度更新为当前偏移量.在使用O_APPEND标识打开一个文件,则相应标识也被设置到文件表项中.每次写文件操作,会设置i-node表项的文件长度,再将写的数据添加到文件末尾.无论lseek定位到哪里,都只会修改当前文件表项的偏移量,而没有进程任何I/0操作.

fork—父子进程会对每一个打开的文件描述符共享一个文件表表项.

dup会使多个文件描述符指向同一表项.

2. 文件表中记录了每个进程的当前偏移量,多个进程同时读一个文件可以正确工作.但是多个进程写同一个文件就会产生的预料不到的结果,需要原子操作.

例如多个进程使用O_APPEND选项来open一个文件,实际上这个写的操作在原来版本的实现中相当于如下形式 :

if (lseek(fd, 0L, 2) < 0)

err_sys(“can not seek”);

if(lseek(fd, buf, 100) != 100)

err_sys(“can not write”)

如果不是原子操作,多个进程同时使用这种方法添加数据就会产生问题.(比如应用服务器中多线程执行的多个组件写日志操作.)

在UNIX中扩展了lseek read/write的原子性操作函数,原型为

#include <unistd.h>

ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);

ssize_t pwrite(int filedes, void *buf, size_t nbytes, off_t offset);

从filedes的offset处(从文件开始位置的偏移量)读取/写入nbytes个字符.文件当前偏移量不改变.

调用pread相当于顺序调用 lseek 和 read,但是pread 又与这种顺序调用有下列重要区别:

1. 调用pread时,无法中断其定位和读操作.

2. 不更新文件指针.

调用pwrite相当于顺序调用lseek和write,同样是原子操作且无法中断.

3. 另一种需要原子操作的情形:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号