文件系统的设计及实现
内容要求:
为Linux系统设计一个简单的二级文件系统。要求做到以下几点:
1.可以实现下列几条命令:
login 用户登录
dir 列目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
2.列目录时要列出文件名,物理地址,保护码和文件长度。
3.源文件可以进行读写保护。
程序设计
1.设计思想:
采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
2.主要数据结构:
(1) i节点
struct inode {
struct inode *i_forw;
struct inode *i_back;
char i_flag;
unsigned int i_ino;
unsigned int i_count;
unsigned short di_number;
unsigned short di_mode;
unsigned short di_uid;
unsigned short di_gid;
unsigned int di_addr [NADDR];
(2) 磁盘i节点
struct dinode
{
unsigned short di_number;
unsigned short di_mode;
unsigned short di_uid;
unsigned short di_gid;
unsigned long di_size;
unsigned int di_addr [NADDR];
}
(3) 目录项结构
struct direct
{
char d_name [DIRSIZ];
unsigned int d_ino;
}
(4) 超级块
struct filsys
{
unsigned short s_isize;
unsigned long s_fsize;
unsigned int s_nfree;
unsigned short s_pfree;
unsigned int s_free[NICFREE];
unsigned int s_ninode;
unsigned short s_pinode;
unsigned int s_inode[NICINOD];
unsigned int s_rinode;
char s_fmod;
};
(5) 用户密码
struct pwd
{
unsigned short p_uid;
unsigned short p_gid;
char *password [PWDSIZ];
};
(6) 目录
struct dir
{
struct direct direct[DIRNUM];
int size;
};
(7) 查内存i节点的hash表
struct hinode
{
struct inode *i_frow;
};
(8) 系统打开表
struct file
{
char f_flag;
unsigned int f_count;
struct inode *f_inode;
unsigned long f_off;
};
(9) 用户打开表
struct user
{
unsigned short u_default_mode;
unsigned short u_uid;
unsigned short u_gid;
unsigned short u_ofile[NOFILE];
};
3.主要函数
(1) i节点内容获取函数iget()
(2) i节点内容释放函数iput()
(3) 目录创建函数mkdir()
(4) 目录搜索函数namei()
(5) 磁盘块分配函数balloc()
(6) 磁盘块释放函数bfree()
(7) 分配节点区函数ialloc()
(8) 释放i节点区函数ifree()
(9) 搜索当前目录下文件的函数iname()
(10) 访问控制函数access()
(11) 显示目录和文件用函数_dir()
(12) 改变当前目录用函数chdir()
(13) 打开文件函数open()
(14) 创建文件函数create()
(15) 读文件用函数read()
(16) 写文件用函数write()
(17) 用户登录函数login()
(18) 用户退出函数logout()
(19) 文件系统格式化函数format()
(20) 进入文件系统函数install()
(21) 关闭文件函数close()
(22) 退出文件系统函数halt()
(23) 文件删除函数delete()
4.主程序说明
Begin
Step1 对磁盘进行格式化
Step2 调用install(),进入文件系统
Step3 调用_dir(),显示当前目录
Step4 调用login(),用户注册
Step5 调用mkdir()和chdir()创建目录
Step6 调用creat()创建文件0
Step7 分配缓冲区
Step8 写文件0
Step9 关闭文件0和释放缓冲
Step10 调用mkdir()和chdir()创建子目录
Step11 调用creat(),创建文件1
Step12 分配缓冲区
Step13 写文件1
Step14 关闭文件1和释放缓冲
Step15 调用chdir()将当前目录移到上一级
Step16 调用creat(),创建文件2
Step17 分配缓冲区
Step18 调用write(),写文件2
Step19 关闭文件2和释放缓冲
Step20 调用delete(),删除文件0
Step21 调用creat(),创建文件3
Step22 为文件3分配缓冲区
Step23 调用write(),写文件3
Step24 关闭文件3并释放缓冲区
Step25 调用open(),打开文件2
Step26 为文件2分配缓冲
Step27 写文件3后关闭文件3
Step28 释放缓冲
Step29 用户退出(logout)
Step30 关闭(halt)
End
该文件系统实际是为用户提供一个解释执行相关命令的环境。主程序中的大部分语句都被用来执行相应的命令。
程序
1.编程管理文件makefile
2头文件filesys.h
3.主程序main() (文件名main.c)
4.初始化磁盘格式程序format() (文件名format.c)
5.进入文件系统程序install() (文件名install.c)
6.退出程序halt() (文件名halt.c)
7.获取释放i节点内容程序iget()/iput() (文件名igetput.c)
8.i节点分配合和释放函数ialloc()和ifree() (文件名iallfre.c)
9.磁盘块分配与释放函数balloc()与bfree() (文件名ballfre.c)
10.搜索函数namei()和iname() (文件名name.c)
11.访问控制函数access() (文件名access.c)
12.显示列表函数dir()和目录创建函数mkdir()等(文件名dir.c)
13.文件创建函数creat()(文件名creat.c)
14.打开文件函数open()(文件名open.c)
15.关闭文件系统函数close() (文件名close.c)
16.删除文件函数delete() (文件名delete.c)
17.读写文件函数read()与write()(文件名rdwt.c)
18.注册和退出函数login()和logout()(文件名log.c)
结果
对上述makefile文件进行编译,得执行文件filsys,在Linux系统中运行结果如下:
$ filsys<CR>
$ format
$ Do you want to format the disk? y
$ Format will erase all context on the disk. Are You Sure!! y
$ install
$ dir
CURRENT DIRECTORY:
. d xxx xxx xxx <dir> block chain:1
.. d xxx xxx xxx <dir> block chain:2
$ login
please input your uid : 2118
password :
ok ! 2118’s user id is : 0
$ mkdir a2118
$ chdir a2118
linux怎么读取文件 $ creat ( 2118 , “file0.c” , 01700 )
the file file0.c fd:0
$ write ( 0 , buf , 3077 )
$ close ( 0 , 0 )
$ mkdir subdir
$ chdir subdir
$ creat ( 2118 , “file1.c”, 01700 )
the file file1.c fd:0
$ write ( 0 , buf , 2068 )
$ chdir ..
$ creat ( 2118 , “file2.c”, 01700 )
the file file2.c fd:1
$ write ( 1 , buf , 1791 )
$ dir
CURRENT DIRECTORY:
. d xxx xxx xxx <dir> block chain:1
.. d xxx xxx xxx <dir> block chain:2
file0.c f xxx --- --- 3077 block chain:4 5 6 7 8 9 10
subdir d xxx xxx xxx <dir> block chain:11
file2.c f xxx --- --- 1791 block chain:17 18 19 20
$ delete file0.c
$ creat ( 2118 , “file3.c” , 01700 )
the file file3.c fd:2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论