⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filsys.h

📁 设计并实现一个多用户多级目录结构的文件系统
💻 H
字号:
/************************************************/
/*												*/
/*				filsys.h						*/
/*												*/
/************************************************/

#define BLOCKSIZ		512				/* 磁盘块大小 */
#define MAXBLOCK		2048			/* 磁盘总块数 */
#define SYSOPENFILE		40				/* 系统打开表最大数 */
#define DIRNUM			128				/* 文件数目 */
#define DIRSIZ			14				/* 文件名长度 */
#define USERNAMESIZ		12				/* 用户名长度 */
#define PWDSIZ			12				/* 密码长度 */
#define PWDNUM			32				/* 允许密码个数 */
#define NOFILE			16				/* 用户打开表最大数 */
#define NADDR			13				/* 物理块号数 */
#define NHINO			64				/* 查找内存i节点的Hash表桶数 */
#define USERNUM			8				/* 允许的最大用户数 */
#define DINODESIZ		64				/* 磁盘i节点大小 */

/* filsys */
#define DINODEBLK		128				/* 磁盘i节点占用盘块数 */
#define FILEBLK			MAXBLOCK - DINODEBLK -2	/* 文件区占用磁盘块数 */
#define NICFREE			50				/* 空闲块堆栈可装入的物理块数 */
#define NICINOD			50				/* 空闲磁盘i节点堆栈可装入的i节点数 */
#define DINODESTART 2 * BLOCKSIZ		/* 磁盘i节点开始地址 */
#define DATASTART (2 + DINODEBLK) * BLOCKSIZ	/* 文件区开始地址 */

/* di_mode */
#define DIEMPTY			000000			/* 空闲磁盘i节点 */
#define DIREG			001000			/* 普通文件 */
#define DIDIR			002000			/* 子目录文件 */
#define UDIREAD			000001			/* 文件主“读”权限 */
#define UDIWRITE		000002			/* 文件主“写”权限 */
#define UDIEXICUTE		000004			/* 文件主“执行”权限 */
#define GDIREAD			000010			/* 同组用户“读”权限 */  
#define GDIWRITE		000020			/* 同组用户“写”权限 */
#define GDIEXICUTE		000040			/* 同组用户“执行”权限 */
#define ODIREAD			000100			/* 其它用户“读”权限  */
#define ODIWRITE		000200			/* 其它用户“写”权限  */
#define ODIEXICUTE		000400			/* 其它用户“执行”权限  */

#define READ			000001			/* 文件“读打开”标志 */
#define WRITE			000002			/* 文件“写打开”标志 */
#define EXICUTE			000004			/* 文件“执行”标志 */

/* 超级用户权限,对所有文件可进行所有操作 */
#define SUPERMODE		000777

/* 一般用户“默认”模式,对其它文件可“读”,对自己的文件可“写”可“执行” */
#define NORMALMODE		000117	

/* 文件或目录的默认”模式,所有用户均可“读”,文件主可“写” */
#define DEFAULTMODE		000113

/* i_flag */
//#define IUPDATE			00002

/* 超级块 */
//#define SUPDATE			00001

/* f_flag */
//#define FREAD			00001
//#define FWRITE			00002
//#define FAPPEND			00004

/* openmode */
#define O_RDONLY		000001		/* 只读 */
#define O_WRONLY		000002		/* 只写 */
#define O_RDWR			000003		/* 读/写 */
#define O_APPEND		010000		/* 读/写指针指到文件尾 */
#define O_TRUNC			020000		/* 如果文件存在,清空文件 */
#define O_CREAT			040000		/* 如果文件不存在,创建文件 */

#define ROOTDIR			2				/* 根目录所在磁盘i节点号 */
//#define DISKFULL		0xffffffff		/* 磁盘满出错 */

#define SEEK_SET		0			/* fseek调用参数,指针指向文件首 */

/* 文件系统(内存i节点)数据结构 */
struct inode
{
	struct inode * i_forw;			/* 前向指针 */
	struct inode * i_back;			/* 后向指针 */
//	char i_flag;					/* 状态标志 */
	unsigned int i_ino;				/* 磁盘i节点标志 */
	unsigned int i_count;			/* 引用计数 */
	unsigned short i_number;		/* 关联文件数,当为0时,则删除该文件 */
	unsigned short i_mode;			/* 文件属性与存取权限 */
	unsigned short i_uid;			/* 文件主标识 */
	unsigned short i_gid;			/* 同组用户标识 */
	unsigned short i_size;			/* 文件大小 */
	unsigned int i_addr[NADDR];		/* 物理块号 */
};

/* 磁盘i节点数据结构 */
struct dinode
{
	/* 磁盘i节点的所有变量在内存i节点中都有相应的变量与之相适应 */

	unsigned short di_number;		/* 关联文件数 */
	unsigned short di_mode;			/* 文件属性与存取权限 */
	unsigned short di_uid;			/* 文件主标识 */
	unsigned short di_gid;			/* 同组用户标识 */
	unsigned short di_size;			/* 文件大小 */
	unsigned int di_addr[NADDR];	/* 物理块号 */
};

/* 查找内存i节点的hash表数据结构 */
struct hinode
{
	struct inode * i_forw;			/* hash 表指针 */
};

/* 超级块数据结构 */
struct filsys
{
	unsigned int s_ninode;			/* 空闲磁盘i节点数 */
//	unsigned short s_isize;			/* 磁盘i节点块块数 */
//	unsigned long s_fsize;			/* 文件区占用磁盘块数 */
	unsigned int s_nfree;			/* 空闲盘块数 */
	unsigned short s_pfree;			/* 空闲盘块指针 */
	unsigned short s_pinode;		/* 空闲磁盘i节点栈指针 */

	unsigned int s_rinode;			/* 铭记磁盘i节点,记录下一组要装入的磁盘i节点号 */
	unsigned int s_free[NICFREE];	/* 空闲盘块堆栈 */
	unsigned int s_inode[NICINOD];  /* 空闲磁盘i节点堆栈 */
//	char s_fmod;					/* 超级块修改标志 */
};

/* 目录数据结构 */
struct direct
{
	char d_name[DIRSIZ];			/* 文件名 */
	unsigned short d_ino;			/* 磁盘i节点号 */
};

#define DIRECTSIZ sizeof( struct direct )	/* 目录结构长度 */

/* 目录数据结构 */
struct dir
{
	struct direct direct[DIRNUM];	/* 目录项 */
	unsigned short size;			/* 当前目录大小 */
};

/* 系统打开表数据结构 */
struct file
{
	char f_flag;					/* 文件操作标志 */
	unsigned int f_count;			/* 引用计数 */
	struct inode * f_inode;			/* 指向内存i节点 */
	unsigned long f_off;			/* 读/写指针 */
};

/* 用户打开表数据结构 */
struct user
{
	char u_name[USERNAMESIZ];		/* 用户名,登陆时用 */
	char password[PWDSIZ];			/* 用户密码,登陆时用 */
	unsigned short u_default_mode;	/* 用户默认模式 */
	unsigned short u_uid;			/* 用户标志 */	
	unsigned short u_gid;			/* 用户组标志 */
	unsigned short u_ofile[NOFILE];	/* 用户打开文件表 */
};

/* 下为全局变量 */
extern struct hinode hinode[NHINO];	/* 查找内存i节点的hash表 */
extern struct dir dir;				/* 当前目录(在内存中全部读入) */
extern struct file sys_ofile[SYSOPENFILE];	/* 系统打开表 */
extern struct filsys filsys;		/* 内存中的超级块 */
extern struct user user[USERNUM];	/* 登陆用户表 */
extern FILE *fd;					/* 本系统的所有文件指针 */
extern struct inode * cur_path_inode;	/* 当前目录路径 */
extern int user_id;					/* 当前用户的ID */
extern char cur_path_name[DIRSIZ];
extern struct direct cur_direct[NOFILE];	/* 路径 */
extern unsigned short cur_dir_id;	/* 当前目录指针 */

extern struct inode * iget();		/* i节点内容获取函数 */
extern iput();						/* i节点内容释放函数 */
extern unsigned int balloc();		/* 磁盘块分配函数 */
extern bfree();						/* 磁盘块释放函数 */
extern struct inode * ialloc();		/* 分配i节点区函数 */
extern ifree();						/* 释放i节点区函数 */
extern unsigned int namei();		/* 目录搜索函数 */
extern unsigned short iname();		/* 搜索当前目录下文件的函数 */
extern unsigned short access();		/* 访问控制函数 */
extern _dir();						/* 显示目录和文件函数 */
extern mkdir();						/* 目录创建函数 */
extern chdir();						/* 更改目录函数 */
extern getdir();					/* 取得当前目录函数 */
extern putdir();					/* 回写目录函数 */
extern int open();					/* 打开文件函数 */
extern creat();						/* 创建文件函数 */
extern int read();					/* 读文件函数 */
extern int write();					/* 写文件函数 */
extern reg();						/* 用户注册函数 */
extern int login();					/* 用户登陆函数 */
extern logout();					/* 用户退出函数 */
extern init();						/* 初始化文件系统函数 */
extern format();					/* 格式化文件系统函数 */
extern close();						/* 关闭文件函数 */
extern halt();						/* 退出文件系统函数 */
//extern char * username;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -