文档详情

unix系统中的文件解析.docx

发布:2017-08-09约6.4千字共8页下载文档
文本预览下载声明
unix系统中的文件解析(附:find命令的简单实现)小生想从源码的角度解释一下Unix的文件系统。(前天因为不能发在首页所以重发,为什么有3天的限制呢,真是的哦)首先一个文件在没有被打开的情况下,需要什么贮存在磁盘呢?一般而言,需要的是:1,一个目录项2,一个磁盘Inode项3,磁盘上的n块(n可为0)目录项是一个结构,最重要的元素一个为名字,一个为指向inode结构的指针。另外目录的执行权是为了把文件名转换为Inode而存在的,具体的操作函数为namei。(大家可参阅具体的源码)?Inode项也是一个结构,v7实现如下struct dinode{??? unsigned short? di_mode;???? ??? /* mode and type of file */??? short?? di_nlink;??? ??? /* number of links to file */??? short?? di_uid;????? ??? /* owners user id */??? short?? di_gid;????? ??? /* owners group id */??? off_t?? di_size;???? ??? /* number of bytes in file */??? char? ? di_addr[40];??? /* disk block addresses */??? time_t? di_atime;?? /* time last accessed */??? time_t? di_mtime;?? /* time last modified */??? time_t? di_ctime;?? /* time created */};元素所表示的内容相关的注释都已经说明了,不过小生还是介绍一下具体的内容di_mode说明文件的权限和类型di_nlink说明文件的链接数di_uid文件的用户,di_gid文件的组di_size逻辑上文件的大小(以字节计数)di_addr文件所占用的磁盘块的地址3个时间表示访问,修改和创建时间?磁盘块没什么好说的,具体实现可能512字节一块?当引用一个文件时(并非打开一个文件)可能需要的如下:1,? 一个内存Inode项?内存inode项的v7实现可能如下:?struct? inode{??? Char??? ??? i_flag;??? char ?? i_count;??? /* reference count */??? dev_t?? i_dev;????? /* device where inode resides */??? ino_t?? i_number;?? /* i number, 1-to-1 with device address */??? unsigned short? i_mode;??? short?? i_nlink;??? /* directory entries */??? short?? i_uid;????? /* owner */??? short?? i_gid;????? /* group of owner */??? off_t?? i_size;???? /* size of file */??? union {??????? struct {??????????? daddr_t i_addr[NADDR];? /* if normal file/directory */??????????? daddr_t i_lastr;??? /* last logical block read (for read-ahead) */??????? };??????? struct? {??????????? daddr_t i_rdev;???????? /* i_addr[0] */??????????? struct? group?? i_group;??? /*? multiplexor group file */??????? };??? } i_un;};基本的内容和磁盘的一样,多出了一些内容,最重要的是多出了i_count用以记录引用次数?当一个文件被打开时需要的内容如下:1,? 用户u区中的u_ofile数组中的一项2,? 文件表中的一项?u_ofile存放的是指向具体的file结构中的一项的指针,所谓的文件描述符就是u_ofile数组的下标?文件表v7的实现如下:struct? file{??? char??? f_flag;??? char ?? f_count;??? /* reference count */??? struct inode *f_inode;? /* pointer t
显示全部
相似文档