os操作系统实验指导(5)

2019-08-31 15:43

step23 调用write( ),写文件3 step24 关闭文件3和释放缓冲 step25 调用open( ),打开文件2 step26 为文件2分配缓冲区 step27 调用open( ),打开文件2 step28 释放缓冲

step29 用户退出(logout) step30 关闭(halt) end

由上述描述过程可知,该文件系统实际是为用户提供一个解释执行相关命令的环境。主程序中的大部分语句都被用来执行相应的命令。

下面,我们给出每个过程的相关C语言程序。读者也可以使用这些子过程,编写出一个用shell控制的文件系统界面。

五、参考程序 1、编写makefile

本文件系统程序用GNU make工具进行管理,makefile内容如下: /***************************************************** makefile

****************************************************/

filsys:main.o igetput.o iallfre.o ballfre.o name.o access.o log.o close.o creat.o delete.o dir.o open.o rdwt.o format.o install.o halt.o

cc -mcpu=i686 -o filsys main.o igetput.o iallfre.o ballfre.o name.o access.o log.o close.o creat.o delete.o dir.o open.o rdwt.o format.o install.o halt.o main.o:main.c filesys.h

cc -mcpu=i686 -c main.c cc -mcpu=i686 -c igetput.c cc -mcpu=i686 -c iallfre.c cc -mcpu=i686 -c ballfre.c cc -mcpu=i686 -c name.c cc -mcpu=i686 -c access.c cc -mcpu=i686 -c log.c cc -mcpu=i686 -c close.c cc -mcpu=i686 -c creat.c cc -mcpu=i686 -c delete.c igetput.o:igetput.c filesys.h iallfre.o:iallfre.c filesys.h ballfre.o:ballfre.c filesys.h name.o:name.c filesys.h access.o:access.c filesys.h log.o:log.c filesys.h close.o:close.c filesys.h creat.o:creat.c filesys.h delete.o:delete.c filesys.h

dir.o:dir.c filesys.h clean:

rm filsys filesystem *.o cc -mcpu=i686 -c dir.c cc -mcpu=i686 -c open.c cc -mcpu=i686 -c rdwt.c cc -mcpu=i686 -c format.c cc -mcpu=i686 -c install.c cc -mcpu=i686 -c halt.c open.o:open.c filesys.h rdwt.o:rdwt.c filesys.h format.o:format.c filesys.h install.o:install.c filesys.h halt.o:halt.c filesys.h

2、头文件filesys.h

头文件filesys.h用来定义本文件系统中所使用的各种数据结构和常数符号。

/****************************************************************** filesys.h

定义本文件系统中的数据结构和常数

******************************************************************/ #define BLOCKSIZ 512 #define SYSOPENFILE 40 #define DIRNUM 128 #define DIRSIZ 14 #define PWDSIZ 12 #define PWDNUM 32 #define NOFILE 20 #define NADDR 10

#define NHINO 128 /*must be power of 2 */ #define USERNUM 10 #define DINODESIZ 32 /*filsys*/

#define DINODEBLK 32 #define FILEBLK 512 #define NICFREE 50 #define NICINOD 50

#define DINODESTART 2*BLOCKSIZ

#define DATASTART (2+DINODEBLK)*BLOCKSIZ /*di_node*/

#define DIEMPTY 00000 #define DIFILE 01000 #define DIDIR 02000

#define UDIREAD 00001 /*user*/ #define UDIWRITE 00002 #define UDIEXICUTE 00004

#define GDIREAD 00010 /* group*/ #define GDIWRITE 00020 #define GDIEXICUTE 00040

#define ODIREAD 00100 /*other*/ #define ODIWRITE 00200 #define ODIEXICUTE 00400 #define READ 1 #define WRITE 2 #define EXICUTE 3

#define DEFAULTMODE 00777 /*i_flag*/

#define IUPDATE 00002 /*s_fmod*/

#define SUPDATE 00001 /*f_flag*/

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

#define DISKFULL 655535 /*fseek origin */ #define SEEK_SET 0

/*文件系统数据结构*/ struct inode

{ struct inode *i_forw; struct inode *i_back; char i_flag;

unsigned int i_ino; /*磁盘i节点标志*/ unsigned int i_count; /*引用计数*/

unsigned short di_number; /*关联文件数,当为0时,则删除该文件*/ unsigned short di_mode; /*存取权限*/ unsigned short di_uid; unsigned short di_gid;

unsigned short di_size; /*文件大小*/ unsigned int di_addr[NADDR]; /*物理块号*/ };

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]; /*物理块号*/ };

struct direct

{ char d_name[DIRSIZ]; unsigned int d_ino; };

struct filsys

{ unsigned short s_isize; /*i节点块数*/ unsigned long s_fsize; /*数据块数*/ unsigned int s_nfree; /*空闲块*/ unsigned short s_pfree; /*空闲块指针*/ unsigned int s_free[NICFREE]; /*空闲块堆栈*/

unsigned int s_ninode; /*number of free inode in s_inode*/ unsigned short s_pinode; /*pointer of the sinode*/ unsigned int s_inode[NICINOD]; /*空闲i节点数*/ unsigned int s_rinode; /*remember inode*/ char s_fmod; /*超级块修改标志*/ }; struct pwd

{ unsigned short p_uid; unsigned short p_gid; char password[PWDSIZ]; }; struct dir

{ struct direct direct[DIRNUM];

int size; /*当前目录大小*/ }; struct hinode

{ struct inode *i_forw; /*hash表指针*/ }; struct file

{ char f_flag; /*文件操作标志*/ unsigned int f_count; /*引用计数*/ unsigned int f_inode; /*指向内存i节点*/

unsigned long f_off; /*read/write character pointer*/ }; struct user

{ unsigned short u_default_mode; unsigned short u_uid; unsigned short u_gid;

unsigned short u_ofile[NOFILE]; /*用户打开文件表*/ /*system open file pointer number */ };

extern struct hinode hinode[NHINO];

extern struct dir dir; /*当前目录(在内存中全部读入)*/ extern struct file sys_ofile[SYSOPENFILE];

extern struct filsys filsys; /*内存中的超级块*/ extern struct pwd pwd[PWDNUM]; extern struct user user[USERNUM];

extern FILE *fd; /* the file system column of all the system*/ extern struct inode *cur_path_inode; extern int user_id; extern int iHave_formated; extern int iCur_free_block_index;

/*proptype of the sub roution used in the file system*/ extern struct inode *iget( ); extern int iput( );

extern unsigned int balloc( ); extern bfree( );

extern struct inode *ialloc( ); extern ifree( );

extern unsigned int namei( ); extern unsigned short iname( ); extern unsigned int access( ); extern _dir( ); extern mkdir( ); extern chdir( );

extern unsigned short open( ); extern creat( );

extern unsigned int read( ); extern unsigned int write( ); extern int login( ); extern logout( ); extern install( ); extern format( ); extern close( ); extern halt( );

3、主程序main( ) (文件名 main.c)

主程序main.c用来测试文件系统的各种设计功能,其主要功能描述如程序设计中的第4部分。

#include \

#include \

struct hinode hinode[NHINO]; struct dir dir;

struct file sys_ofile[SYSOPENFILE];


os操作系统实验指导(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六年级下册英语素材-英语名词单复数变化规律及练习题 - 通用版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: