3.1系统流程 开始 输出登录选1,初始化选2 输入一个整型i N i>0? Y N i==2? Y 结束 初始化程序 N i==1? Y 进入登录程序
N 是否 N 退登录成功? 出? Y Y 进入命令操作程序 结束
结束
3.2文件结构
1.基本思路:
用硬盘上的一个文件(funix.txt)来模拟一个文件卷。 2.磁盘块的设计:
每块512个字节,一共2048块,数据区占用2035块,I节点占用12块,每个i节点占48个字节,一共128个i节点,超级块占第0块。 3.空闲磁盘块:
采用成组链接法管理。每组10块,格式化时假设所有块都分配了出去,将所有块按从大到小的顺序依次压入。 4.I结点管理:
采用位示图法,注意此时位示图不表示空闲块,只表示相应的i节点号是否被利用,如果被利用相应的i节点号对应位示图的那一位为1,如果没有被利用则对应的位为0。
3.3实现命令操作
命令格式
ls 显示文件目录 改变文件权限
改变文件拥有者 改变文件所属组
chmod chown chgrp pwd cd
显示当前目录 改变当前目录
创建子目录 删除子目录 文件创建屏蔽码
mkdir rmdir umask mv cp
改变文件名 文件拷贝 文件或目录删除
rm
ln 建立文件联接 cat
连接显示文件内容 修改用户口令
passwd
touch vi
创建文件
编写文件内容
四. 数据结构
4.1超级块
#ifndef SUPER struct super{
unsigned int csize;//文件系统的总块数(4) unsigned short bsize;//每块的字节数(2)
unsigned int dsize;//数据块的块数(4) unsigned int dbeg;//数据块的起始块号(4) unsigned int demp;//空闲盘块数(4)
unsigned short isize; //i节点块的总块数(2) unsigned int ibeg;//i节点的起始块号(4) unsigned short inum;//i节点的个数(2) unsigned short i[8];//i节点位示图(12) unsigned short iclock;//inode锁(2)
unsigned int mfsize;//文件的最大所占字节数(4) unsigned short bmf;//文件的最大所占块数(2)
time_t bu;//修改时间(8)
short dssize;//当前空闲盘块好栈中的空闲盘块数目(2) unsigned int dss[DS_size];//(400)
unsigned short dsclock;//成组链接锁(2) }sup; #endif
4.2 I节点
//外存i节点 #ifndef INODE struct inode{
unsigned int fsize;//文件大小(4) unsigned short fln;//文件连接数(2) char gid;//文件所属组id(1) char uid;//文件拥有者id(1)
int fmode;//文件的类型和权限(4) time_t itime;//文件最后修改时间(8) unsigned int addr[6];//文件地址(24) };
#endif
//内存i节点 #ifndef MINODE struct minode{
int iid;//i节点号
struct inode in;//读入内存的外存i节点/ char chflg;//是否被修改
unsigned short mico;//(未用到)进程连接的个数 }; #endif
4.3目录
//目录
#ifndef LIST struct list{
char ls_name[14]://文件或目录名; unsigned short ib;//对应的i节点号/ }; #endif
4.4用户文件表
#ifndef LS_MINODE struct ls_minode{
unsigned int f_offest://文件相对起始位置的偏移; int f_flag://文件的存取权限;
unsigned short f_count://打开这个文件的操作的个数; struct minode* mi://内存i节点; }f_inode[50]; #endif
4.5用户和组
外存用户信息 #ifndef USER struct user{
char username[14];//用户名 char uid;//用户id
char grpname[14];//组名 char gid;//组id int umask;//屏蔽码
char password[20];//密码 char homedir[50];//家目录 }; #endif
相关推荐: