📄 os.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 + -