UNIX文件系统的分析和比较深入认识

小生想从源码的角度解释一下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; /* owner's user id */
short di_gid; /* owner's 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 to inode structure */
union {
off_t f_offset; /* read/write character pointer */
struct chan *f_chan; /* mpx channel pointer */
} f_un;
};

文件表最初似乎是为了共享偏移量(f_offset)而设计的,因为有注释就不多赘叙了,正如大家所知道的,用dup复制一个文件描述符和再次打开一个文件是不一样,具体的差别就是f_count的值。实际上大家可以自己思考一下所有的文件打开关闭,link和unlink等等文件操作(我想这是非常有益,不过大家不必真的去参阅源码,只要自己想想是怎么回事就行,unix源码水平极高,如果真的全部看懂需要很多时间)。
另外鉴于要不发布要不烂掉的原则,我将本人昨天晚上写的源码发布。
源码是find命令的简单实现,直接的参数是-name, -user, -group,具体用法如下
Find 目录(文件)列表 可选的参数
源码的水平并不高,而且实现也不是很好,不过我想初学c的读者还是能得到一定的帮助的,
如果有高手觉得哪里需要修改的,请注明

小生想从源码的角度解释一下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; /* owner's user id */
short di_gid; /* owner's 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 to inode structure */
union {
off_t f_offset; /* read/write character pointer */
struct chan *f_chan; /* mpx channel pointer */
} f_un;
};

文件表最初似乎是为了共享偏移量(f_offset)而设计的,因为有注释就不多赘叙了,正如大家所知道的,用dup复制一个文件描述符和再次打开一个文件是不一样,具体的差别就是f_count的值。实际上大家可以自己思考一下所有的文件打开关闭,link和unlink等等文件操作(我想这是非常有益,不过大家不必真的去参阅源码,只要自己想想是怎么回事就行,unix源码水平极高,如果真的全部看懂需要很多时间)。
另外鉴于要不发布要不烂掉的原则,我将本人昨天晚上写的源码发布。
源码是find命令的简单实现,直接的参数是-name, -user, -group,具体用法如下
Find 目录(文件)列表 可选的参数
源码的水平并不高,而且实现也不是很好,不过我想初学c的读者还是能得到一定的帮助的,
如果有高手觉得哪里需要修改的,请注明
[/code]

(0)

相关推荐

  • UNIX命令行惯用语ibm官方完整版本

    当您到使用不同语言的国家去旅行时,可能需要掌握一些关键的日常用语,如“这个东西多少钱?”、“这是什么肉?”以及“洗手间在何处?”。记住这些简短的日常用语可以确保别人不会对您定购的三明治要价太高,并且在 ...

  • 电脑高手必读 服务器基础知识大全(图文)

    服务器对于大部分人已经不再那么陌生,现在的公司用到服务器的情况很多,例如Web服务器、打印服务器都是我们日常接触的比较多的应用。而对于服务器的了解方面,很多人大概只停留在表面上,当作一个比较高级的电脑 ...

  • solaris迅速查找手册

    硬件系统: 1、如何查看cup的状态? 作者:南非蜘蛛? # psrinfo -v # mpstat 可以列出多cpu负载的状态 2、如何查看内存? 作者:南非蜘蛛? # prtconf | grep ...

  • Solaris系统硬盘分区知识

    Solaris下,一个磁盘包含8个分区,标记为0-7。此信息可以通过format命令,然后选择一个硬盘来看到,例如,在我自己的系统中(Solaris 9,Ultra 60),显示出来的信息如下: # ...

  • 苹果Mac OS X系统快速显示/恢复隐藏文件的方法介绍

    Mac OS X快速显示、恢复隐藏文件的方法 在Mac OS X中,文件名前有一个点“.”就可以隐藏文件。你以前可能注意过这点,例如,当你将文件从mac复制到PC中,可以看到.DS_Store文件,但 ...

  • 苹果Mac OS系统终端命令大全介绍

    Mac OS X操作系统下,也有类似于Windows下面的CMD运行框哦!你可以像 Windows 一样在 Mac 终端里面件数各种指令来操作你的Mac,例如:隐藏和显示文件,修改Hosts,查询IP ...

  • Mac系统终端命令大全

    输入:sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts就可以用文本编辑来直接修改hosts 了. 隐藏文件是否显示有 ...

  • Linux系统中清理文件和清理环境变量的方法

    使用 Find 命令来帮你找到那些需要清理的文件 一个问题几乎困扰着所有的文件系统 -- 包括 Unix 和其他的 -- 那就是文件的不断积累.几乎没有人愿意花时间清理掉他们不再使用的文件和整理文件系 ...

  • 解析Linux系统启动的引导流程

    LINUX是自由开源软件,在LINUX里一切都是文件,不管是命令,操作等等都是以文件形式保存,这篇博客来记录LINUX启动时的引导流程是通过哪写文件来完成的. 使用的LINUX版本是CentOS5,C ...