小生想从源码的角度解释一下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]
首先一个文件在没有被打开的情况下,需要什么贮存在磁盘呢?
一般而言,需要的是:
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]
标签:
UNIX文件系统,find命令
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“UNIX文件系统的分析和比较深入认识”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
2024年11月23日
2024年11月23日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]