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

📄 os.h

📁 UNIX模拟系统模拟得很完善!
💻 H
字号:
//********************************
//
//       头文件 os.h            
//
//*********************************

#include <stdio.h>
#include <dos.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节点大小 */
#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 UREAD			000001	                		/* 文件主"读"权限 */
#define UWRITE			000002	                   		/* 文件主"写"权限 */
#define UEXE			000004	                   		/* 文件主"执行"权限 */
#define GREAD			000010	                   		/* 同组用户"读"权限 */  
#define GWRITE			000020	                   		/* 同组用户"写"权限 */
#define GEXE			000040	                		/* 同组用户"执行"权限 */
#define OREAD			000100	                		/* 其它用户"读"权限  */
#define OWRITE			000200	                		/* 其它用户"写"权限  */
#define OEXE			000400	                   		/* 其它用户"执行"权限  */

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

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

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

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

/* 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 SEEK_SET		0	                      		/* fseek调用参数,指针指向文件首 */

/* 文件系统(内存i节点)数据结构 */
struct inode
{
	struct inode * i_forw;		                 		/* 前向指针 */
	struct inode * i_back;		                		/* 后向指针 */
	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 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节点堆栈 */

};

/* 目录数据结构 */
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 struct direct cur_direct[NOFILE];      	        /* 路径 */
extern unsigned short cur_dir_id;		    	        /* 当前目录指针 */

extern void bread();					                /* 读相应盘块号的数据函数 */
extern void bwrite();					                /* 写相应盘块号的数据函数 */
extern struct inode * iget();		     		        /* i节点内容获取函数 */
extern void iput();					                    /* i节点内容释放函数 */
extern unsigned int balloc();		    		        /* 磁盘块分配函数 */
extern void bfree();				    	            /* 磁盘块释放函数 */
extern struct inode * ialloc();		    		        /* 分配i节点区函数 */
extern void ifree();				    	            /* 释放i节点区函数 */
extern int namei();					                    /* 目录搜索函数 */
extern unsigned short iname();			    	        /* 搜索当前目录下文件的函数 */
extern unsigned short access();		    		        /* 访问控制函数 */

extern void choice();
extern void help();
extern void _dir();				                	    /* 显示目录和文件函数 */
extern void mkdir();		                   			/* 目录创建函数 */
extern void chdir();	                   				/* 更改目录函数 */
extern void rmdir();	                 				/* 删除目录函数 */
extern struct dir getdir();	                  			/* 取得当前目录函数 */
extern void putdir();	                  				/* 回写目录函数 */
extern int open();		                   			    /* 打开文件函数 */
extern void close();                					/* 关闭文件函数 */
extern int creat();	                 				    /* 创建文件函数 */
extern void _delete();	                				/* 删除文件函数 */
extern int read();	                   				    /* 读文件函数 */
extern int write();	                   			    	/* 写文件函数 */
extern void chmod();	                  				/* 改变文件或目录权限函数 */
extern void edlin();                   					/* 微型vi编辑器,可新建文件 */
extern void list();		                   		    	/* 显示文件内容函数 */
extern void reg();	               	       	    		/* 用户注册函数 */
extern int login();			                    		/* 用户登陆函数 */
extern quit();				                    		/* 用户退出函数 */
extern init();				                    		/* 初始化文件系统函数 */
extern format();	                        			/* 格式化文件系统函数 */
extern halt();		                  	    			/* 退出文件系统函数 */

⌨️ 快捷键说明

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