46
文文文 文文 _ 1 成成成成成成成成 成成 8 8 文文文 文文 文文文 文文 8.1 8.1 文文文文 文文文文 8.2 8.2 文文文文 文文文文 8.2.1 8.2.1 文文文文 文文文文 文 8-1 文文文 文文文文文

第 8 章 文件系统实验

  • Upload
    july

  • View
    111

  • Download
    8

Embed Size (px)

DESCRIPTION

第 8 章 文件系统实验. 8.1 实验目的 8.2 准备知识 8.2.1 外存管理. 图 8-1 文件系统的层次结构. 8.2.2 目录管理 图 8-2 两级目录结构. 8.2.3 文件系统的接口 8.2.4 Linux 的 EXT2 文件系统 图 8-3 EXT2 文件系统的结构. 8.2.5 可能用到的编程技术 FILE *fopen(const char *filename,const char *mode) - PowerPoint PPT Presentation

Citation preview

Page 1: 第 8 章  文件系统实验

文件系统实验 _ 1 成都信息工程学院 徐虹

第第 88 章 文件系统实验章 文件系统实验• 8.1 8.1 实验目的实验目的• 8.2 8.2 准备知识准备知识• 8.2.1 8.2.1 外存管理外存管理

图 8-1 文件系统的层次结构

Page 2: 第 8 章  文件系统实验

文件系统实验 _ 2 成都信息工程学院 徐虹

• 8.2.2 8.2.2 目录管理目录管理

• 图图 8-2 8-2 两级目录结构两级目录结构

Page 3: 第 8 章  文件系统实验

文件系统实验 _ 3 成都信息工程学院 徐虹

• 8.2.3 8.2.3 文件系统的接口文件系统的接口• 8.2.4 Linux8.2.4 Linux 的的 EXT2EXT2 文件系统文件系统

• 图图 8-3 EXT28-3 EXT2 文件系统的结构文件系统的结构

Page 4: 第 8 章  文件系统实验

文件系统实验 _ 4 成都信息工程学院 徐虹

• 8.2.5 8.2.5 可能用到的编程技术可能用到的编程技术• FILE *fopen(const char FILE *fopen(const char

*filename,const char *mode)*filename,const char *mode)• size_t fwrite(const size_t fwrite(const

void*buffer,size_t size,size_t void*buffer,size_t size,size_t count,FILE*stream);count,FILE*stream);

• size_t fread( void*buffer, size_t size_t fread( void*buffer, size_t size, size_t count, FILE*stream );size, size_t count, FILE*stream );

• int fseek( FILE*stream, long offset, int fseek( FILE*stream, long offset, int origin );int origin );

Page 5: 第 8 章  文件系统实验

文件系统实验 _ 5 成都信息工程学院 徐虹

• 8.2.6 8.2.6 用内存模拟外存用内存模拟外存• ......• fd=fopen("filesystem","w+b"); fd=fopen("filesystem","w+b"); // fd// fd

是是 FILEFILE 指针类型指针类型 ,w,w 便是便是• // // 写方式写方式 ,b,b 表示二进制表示二进制• fseek(fd, specific_area,SEEK_SET); fseek(fd, specific_area,SEEK_SET); // fd// fd是文件指针是文件指针 ; specific_area; specific_area 为整型为整型• // // 数数 ,, 为需要写入为需要写入

pInodepInode 的位置的位置• fwrite(pInode,1,sizeof(inode),fd); fwrite(pInode,1,sizeof(inode),fd); // // 写写

入入 pInodepInode 信息信息• ......

Page 6: 第 8 章  文件系统实验

文件系统实验 _ 6 成都信息工程学院 徐虹

• 8.3 8.3 实验内容实验内容• 8.4 8.4 实验指导实验指导• 8.4.1 8.4.1 文件系统的数据结构文件系统的数据结构• struct inode {struct inode {• struct inode*i_forw;struct inode*i_forw;• struct inode*i_back;struct inode*i_back;• char i_flag;char i_flag;• unsigned int i_ino;unsigned int i_ino;• unsigned int i_count;unsigned int i_count;• unsigned int di_addr[NADDR] ;unsigned int di_addr[NADDR] ;• unsigned short di_number;unsigned short di_number;• unsigned short di_mode;unsigned short di_mode;• unsigned short di_uid;unsigned short di_uid;• unsigned short di_gid;unsigned short di_gid;• unsigned short di_size;unsigned short di_size;• };};

Page 7: 第 8 章  文件系统实验

文件系统实验 _ 7 成都信息工程学院 徐虹

• struct filsys {struct filsys {• unsigned short s_isize;unsigned short s_isize;• unsigned long s_fsize;unsigned long s_fsize;•• unsigned int s_nfree;unsigned int s_nfree;• unsigned short s_pfree;unsigned short s_pfree;• unsigned int s_free[NICFREE] ;unsigned int s_free[NICFREE] ;• unsigned int s_ninode;unsigned int s_ninode;• unsigned short s_pinode;unsigned short s_pinode;• unsigned int s_inode[NICINOD] ;unsigned int s_inode[NICINOD] ;• unsigned int s_rinode;unsigned int s_rinode;• char s_fmod;char s_fmod;• };};

Page 8: 第 8 章  文件系统实验

文件系统实验 _ 8 成都信息工程学院 徐虹

• struct user {struct user {• unsigned short u_default_mode;unsigned short u_default_mode;• unsigned short u_uid;unsigned short u_uid;• unsigned short u_gid;unsigned short u_gid;• unsigned short u_ofile[NOFILE];unsigned short u_ofile[NOFILE];• };};• struct pwd {struct pwd {• unsigned short p_uid;unsigned short p_uid;• unsigned short p_gid;unsigned short p_gid;• char password[PWDSIZ];char password[PWDSIZ];• };};

Page 9: 第 8 章  文件系统实验

文件系统实验 _ 9 成都信息工程学院 徐虹

• struct dinode {struct dinode {• unsigned short di_number;unsigned short di_number;• unsigned short di_mode;unsigned short di_mode;• unsigned short di_uid;unsigned short di_uid;• unsigned short di_gid;unsigned short di_gid;• unsigned long di_size;unsigned long di_size;• unsigned int di_addr[NADDR];unsigned int di_addr[NADDR];• };};• struct direct {struct direct {• char d_name[DIRSIZ];char d_name[DIRSIZ];• unsigned int d_ino;unsigned int d_ino;• };};• struct dir {struct dir {• struct direct direct[DIRNUM];struct direct direct[DIRNUM];• int size;int size;• };};

Page 10: 第 8 章  文件系统实验

文件系统实验 _ 10 成都信息工程学院 徐虹

8.4.2 程序设计思想

图 8-4 main 函数流程

Page 11: 第 8 章  文件系统实验

文件系统实验 _ 11 成都信息工程学院 徐虹

• #include <malloc.h>#include <malloc.h>• #include <stdio.h>#include <stdio.h>• #include <stdlib.h>#include <stdlib.h>• #include <string.h>#include <string.h>• #include "structure.h"#include "structure.h"• #include "creat.h"#include "creat.h"• #include "access.h"#include "access.h"• #include "ballfre.h"#include "ballfre.h"• #include "close.h"#include "close.h"• #include "delete.h"#include "delete.h"• #include "dir.h"#include "dir.h"• #include "format.h"#include "format.h"• #include "halt.h"#include "halt.h"• #include "iallfre.h"#include "iallfre.h"• #include "install.h"#include "install.h"• #include "log.h"#include "log.h"• #include "name.h"#include "name.h"• #include "open.h"#include "open.h"• #include "rdwt.h"#include "rdwt.h"• #include "igetput.h"#include "igetput.h"

Page 12: 第 8 章  文件系统实验

文件系统实验 _ 12 成都信息工程学院 徐虹

• struct hinode hinode[NHINO];struct hinode hinode[NHINO];• struct dir dir;struct dir dir;• struct file sys_ofile[SYSOPENFILE];struct file sys_ofile[SYSOPENFILE];• struct filsys filsys;struct filsys filsys;• struct pwd pwd[PWDNUM];struct pwd pwd[PWDNUM];• struct user user[USERNUM];struct user user[USERNUM];• FILE*fd;FILE*fd;• struct inode*cur_path_inode;struct inode*cur_path_inode;• int user_id;int user_id;• unsigned short usr_id;unsigned short usr_id;• char usr_p[12];char usr_p[12];• char sel;char sel;• char temp_dir[12];char temp_dir[12];

Page 13: 第 8 章  文件系统实验

文件系统实验 _ 13 成都信息工程学院 徐虹

• main()main()• {{• unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j;unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j;• char*buf;char*buf;• int done=1;int done=1;•• printf("\nDo you want to format the disk(y or n)?\n");printf("\nDo you want to format the disk(y or n)?\n");• if(getchar()=='y')if(getchar()=='y')• { printf("\nFormat will erase all context on the disk \n");{ printf("\nFormat will erase all context on the disk \n");• printf("Formating ... \n");printf("Formating ... \n");• format();format();• printf("\nNow will install the fillsystem,please wait ... \printf("\nNow will install the fillsystem,please wait ... \

n");n");• install();install();• printf("\n----Login----\nPlease input your userid:");printf("\n----Login----\nPlease input your userid:");• scanf("%u",&usr_id);scanf("%u",&usr_id);• printf("\nPlease input your password:");printf("\nPlease input your password:");• scanf("%s",&usr_p);scanf("%s",&usr_p);• if(!login(usr_id,usr_p))if(!login(usr_id,usr_p))• return;return;

Page 14: 第 8 章  文件系统实验

文件系统实验 _ 14 成都信息工程学院 徐虹

• while(done) {while(done) {• printf("\n Please Select Your Operating\n");printf("\n Please Select Your Operating\n");• printf(" -1----ls\n -2----mkdir\n -3----change dir\n -4----printf(" -1----ls\n -2----mkdir\n -3----change dir\n -4----

createcreate• file\n -0----Logout\n");file\n -0----Logout\n");• sel=getche();sel=getche();• switch(sel)switch(sel)• {{• case '1': case '1': /* /* 显示目录内容 显示目录内容 **//• _dir();_dir();• break;break;• case '2': case '2': /* /* 创建目录 创建目录 **//• printf("Please input dir name:");printf("Please input dir name:");• scanf("%s",temp_dir);scanf("%s",temp_dir);• mkdir(temp_dir);mkdir(temp_dir);• break;break;• case '3': case '3': /* /* 改变当前目录 改变当前目录 **//• printf("Please input dir name:");printf("Please input dir name:");• scanf("%s",temp_dir);scanf("%s",temp_dir);• chdir(temp_dir);chdir(temp_dir);• break;break;

Page 15: 第 8 章  文件系统实验

文件系统实验 _ 15 成都信息工程学院 徐虹

case '4': case '4': /* /* 创建文件 创建文件 **// printf("Please input file name:");printf("Please input file name:"); scanf("%s",temp_dir);scanf("%s",temp_dir); ab_fd1=creat(2118,temp_dir,01777);ab_fd1=creat(2118,temp_dir,01777); buf=(char*)malloc(BLOCKSIZ*6+5);buf=(char*)malloc(BLOCKSIZ*6+5); write(ab_fd1,buf,BLOCKSIZ*6+5);write(ab_fd1,buf,BLOCKSIZ*6+5); close(0,ab_fd1);close(0,ab_fd1); free(buf);free(buf); break;break;case '0': case '0': /* /* 退出文件系统 退出文件系统 **// logout(usr_id);logout(usr_id); halt();halt(); done = 0;done = 0; default:printf("Error!\nNo such command,please try again.default:printf("Error!\nNo such command,please try again. \nOr you can ask yourteacher for help.\n");\nOr you can ask yourteacher for help.\n"); break;break; }}

}} }} elseelse printf("User canseled\nGood Bye\n");printf("User canseled\nGood Bye\n");}}

Page 16: 第 8 章  文件系统实验

文件系统实验 _ 16 成都信息工程学院 徐虹

表表 8-1 8-1 实验设计的文件系统与真正文件系统的区别实验设计的文件系统与真正文件系统的区别

实验设计的文件系统 真正文件系统二进制格式 自定义系统文件格式依赖其他操作系统 不依赖于其他操作系统调用库函数访问外存 调用中断访问外存

Page 17: 第 8 章  文件系统实验

文件系统实验 _ 17 成都信息工程学院 徐虹图 8-5 数据地址安排

Page 18: 第 8 章  文件系统实验

文件系统实验 _ 18 成都信息工程学院 徐虹

8.4.3 8.4.3 几个重要的算法处理几个重要的算法处理

图 8-7 数据块的分配

Page 19: 第 8 章  文件系统实验

文件系统实验 _ 19 成都信息工程学院 徐虹

for(i=NICFREE+2;i<FILEBLK;i+=50) for(i=NICFREE+2;i<FILEBLK;i+=50) /* /* 要加上要加上 22 的原因是:每的原因是:每 5050 个个 BLOCKBLOCK 成组成组 ,, 在每个在每个 BLOCKBLOCK 组当中的第一个组当中的第一个 BLOCK(BLOCK( 称为地址块称为地址块 ))放有整个放有整个 BLOCKBLOCK 组的地址。这样组的地址。这样 ,filsys.s_free[0],filsys.s_free[0] 指向该组的地址块指向该组的地址块 ,, 而而 filsys.s_freefilsys.s_free[49][49] ++ 11 则指向下一个组的地址块 则指向下一个组的地址块 **/ /

{{for(j=0;j<NICFREE;j++)for(j=0;j<NICFREE;j++){{

block_buf[NICFREE-1-j]=i-j;block_buf[NICFREE-1-j]=i-j;}}fseek(fd,DATASTART+BLOCKSIZ* (i-49),SEEK_SET);fseek(fd,DATASTART+BLOCKSIZ* (i-49),SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);fwrite(block_buf,1,BLOCKSIZ,fd);

}} // // 当当 i=502i=502 之后之后 ,, 完成文件块完成文件块 502~453502~453 的写入的写入 ; ; 之后文件块之后文件块 512~503512~503 不能进行不能进行 ,, 需要特殊处理需要特殊处理

for(i=503;i<512;i++)for(i=503;i<512;i++)block_buf[i-503]=i;block_buf[i-503]=i;

fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd); // fwrite(block_buf,1,BLOCKSIZ,fd); // 至此至此 ,, 才完成才完成 512512 块文件块的定位块文件块的定位for(i=0;i<NICFREE;i++)for(i=0;i<NICFREE;i++){{

filsys.s_free[i]=i+3;filsys.s_free[i]=i+3; // // 从从 DATASTARTDATASTART 的第一个的第一个 BLOCKBLOCK 作为作为 MAINMAIN

// DIRECTORY// DIRECTORY // // 第二个第二个 BLOCKBLOCK 作为作为 etcetc 目录目录 // // 第三个第三个 BLOCKBLOCK 作为作为 passwordpassword 文件文件 // // 故此故此 ii 要加要加 33

}}

Page 20: 第 8 章  文件系统实验

文件系统实验 _ 20 成都信息工程学院 徐虹图 8-8 数据块的回收

Page 21: 第 8 章  文件系统实验

文件系统实验 _ 21 成都信息工程学院 徐虹

if(filsys.s_nfree==0)if(filsys.s_nfree==0){{printf("\nDisk Full!!\n");printf("\nDisk Full!!\n");return DISKFULL;return DISKFULL;}}i=filsys.s_pfree;i=filsys.s_pfree;flag=(i==0);flag=(i==0);if(flag) // if(flag) // 该该 BLOCKBLOCK 组全部用了组全部用了{{fseek(fd,DATASTART+BLOCKSIZ* (filsys.s_free[NICFREE-1]+1),SEEK_SET);fseek(fd,DATASTART+BLOCKSIZ* (filsys.s_free[NICFREE-1]+1),SEEK_SET); // filsys.s_free[NICFREE-1]+1// filsys.s_free[NICFREE-1]+1 指向下一个指向下一个 blockblock 组的地址块组的地址块fread(block_buf,1,BLOCKSIZ,fd);fread(block_buf,1,BLOCKSIZ,fd);for(i=0;i<NICFREE;i++)for(i=0;i<NICFREE;i++){{filsys.s_free[i]=block_buf[i];filsys.s_free[i]=block_buf[i];} // } // 将待用将待用 blockblock 组的地址读入超级块组的地址读入超级块filsys.s_pfree=NICFREE-1;filsys.s_pfree=NICFREE-1;free_block=filsys.s_free[filsys.s_pfree];free_block=filsys.s_free[filsys.s_pfree];}}elseelse{{free_block=filsys.s_free[filsys.s_pfree];free_block=filsys.s_free[filsys.s_pfree];filsys.s_pfree--;filsys.s_pfree--;}}

Page 22: 第 8 章  文件系统实验

文件系统实验 _ 22 成都信息工程学院 徐虹图 8-9 访问控制

Page 23: 第 8 章  文件系统实验

文件系统实验 _ 23 成都信息工程学院 徐虹

• if(filsys.s_pfree==NICFREE-1)if(filsys.s_pfree==NICFREE-1)• // // 表示回收的表示回收的 blockblock 已经可以组成一个已经可以组成一个 blockblock 组组了了• {{• for(i=0;i<NICFREE;i++)for(i=0;i<NICFREE;i++)• {{• block_buf[i]=filsys.s_free[NICFREE-1-i];block_buf[i]=filsys.s_free[NICFREE-1-i];• }}• filsys.s_pfree=0;filsys.s_pfree=0;•• fseek(fd,DATASTART+BLOCKSIZ* fseek(fd,DATASTART+BLOCKSIZ*

(filsys.s_free[0]),SEEK_SET);(filsys.s_free[0]),SEEK_SET);• // filsys.s_free[0]// filsys.s_free[0] 为当前为当前 BLOCKBLOCK 组的地组的地址块址块• fwrite(block_buf,1,BLOCKSIZ,fd);fwrite(block_buf,1,BLOCKSIZ,fd);• }}• else filsys.s_pfree++;else filsys.s_pfree++;

Page 24: 第 8 章  文件系统实验

文件系统实验 _ 24 成都信息工程学院 徐虹图 8-10 创建文件

Page 25: 第 8 章  文件系统实验

文件系统实验 _ 25 成都信息工程学院 徐虹

• switch(mode)switch(mode)• {case READ:{case READ:• if(inode->di_mode&ODIREAD) if(inode->di_mode&ODIREAD)

return 1;return 1;• if((inode->di_mode&GDIREAD)&&if((inode->di_mode&GDIREAD)&&•

(user[user_id].u_gid==inode->di_gid)) return 1;(user[user_id].u_gid==inode->di_gid)) return 1;• if((inode->di_mode&UDIREAD)&&if((inode->di_mode&UDIREAD)&&•

(user[user_id].u_uid==inode->di_uid)) return 1;(user[user_id].u_uid==inode->di_uid)) return 1;• return 0;return 0;• case WRITE: ...case WRITE: ...• case EXICUTE: ...case EXICUTE: ...• default: rerturn 1;default: rerturn 1;

Page 26: 第 8 章  文件系统实验

文件系统实验 _ 26 成都信息工程学院 徐虹

• while(i<USERNUM) // user[]while(i<USERNUM) // user[] 的值由函数的值由函数 login()login() 注册注册 ,, 参参看文件看文件 log.hlog.h• {if(user[i].u_uid==uid){user_id=i;{if(user[i].u_uid==uid){user_id=i;• break;}break;}• i++;}i++;}• if(i==USERNUM){if(i==USERNUM){• printf("The user id is wrong.\n");printf("The user id is wrong.\n");• exit(1);}exit(1);}• if(di_ino!=-1) {// if(di_ino!=-1) {// 文件已经存在文件已经存在• inode=iget(di_ino);inode=iget(di_ino);• if(access(user_id,inode,mode)==0){iput(inode);if(access(user_id,inode,mode)==0){iput(inode);• printf("\nThe access is not allowed\n");return 0;}printf("\nThe access is not allowed\n");return 0;}• else{inode=ialloc();else{inode=ialloc();• di_ith=iname(filename);di_ith=iname(filename);• dir.size++;dir.size++;

Page 27: 第 8 章  文件系统实验

文件系统实验 _ 27 成都信息工程学院 徐虹

图 8-11 删除文件

Page 28: 第 8 章  文件系统实验

文件系统实验 _ 28 成都信息工程学院 徐虹

• delete(char*filename){delete(char*filename){• unsigned int dinodeid;unsigned int dinodeid;• struct inode*inode;struct inode*inode;• dinodeid=namei(filename);dinodeid=namei(filename);• if(dinodeid!=(int)NULL)if(dinodeid!=(int)NULL)• inode=iget(dinodeid);inode=iget(dinodeid);• inode->di_number--;inode->di_number--;• iput(inode);}iput(inode);}• inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode;inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode;• if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FREAD)){if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FREAD)){• printf("\nThe file is not opened for read.\n");printf("\nThe file is not opened for read.\n");• return 0;}return 0;}• if((off+size)>inode->di_size) size=inode->di_size-off;if((off+size)>inode->di_size) size=inode->di_size-off;• block_off=off%BLOCKSIZ;block_off=off%BLOCKSIZ;• block=off/BLOCKSIZ;block=off/BLOCKSIZ;• if(block_off+size<BLOCKSIZ)if(block_off+size<BLOCKSIZ)• for(i=0;i<(int)(size-block_off)/BLOCKSIZ;i++){for(i=0;i<(int)(size-block_off)/BLOCKSIZ;i++){• fseek(fd,DATASTART+inode->di_addr[j+i] fseek(fd,DATASTART+inode->di_addr[j+i]

*BLOCKSIZ,SEEK_SET);*BLOCKSIZ,SEEK_SET);• fread(temp_buf,1,BLOCKSIZ,fd);fread(temp_buf,1,BLOCKSIZ,fd);• temp_buf+=BLOCKSIZ;}temp_buf+=BLOCKSIZ;} }}

Page 29: 第 8 章  文件系统实验

文件系统实验 _ 29 成都信息工程学院 徐虹图 8-12 读文件

Page 30: 第 8 章  文件系统实验

文件系统实验 _ 30 成都信息工程学院 徐虹图 8-13 写文件

Page 31: 第 8 章  文件系统实验

文件系统实验 _ 31 成都信息工程学院 徐虹

• if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FWRITE)){if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FWRITE)){• printf("\nThe file is not opened for write\n");printf("\nThe file is not opened for write\n");• return 0;}return 0;}• if(block_off+size<BLOCKSIZ){if(block_off+size<BLOCKSIZ){• fseek(fd,DATASTART+inode->di_addr[block] fseek(fd,DATASTART+inode->di_addr[block]

*BLOCKSIZ+block_off,SEEK_SET);*BLOCKSIZ+block_off,SEEK_SET);• fwrite(buf,1,size,fd);fwrite(buf,1,size,fd);• return size;}return size;}• fseek(fd,DATASTART+inode->di_addr[block] fseek(fd,DATASTART+inode->di_addr[block]

*BLOCKSIZ+block_off,SEEK_SET);*BLOCKSIZ+block_off,SEEK_SET);• fwrite(temp_buf,1,BLOCKSIZ-block_off,fd);fwrite(temp_buf,1,BLOCKSIZ-block_off,fd);• temp_buf+=BLOCKSIZ-block_off;temp_buf+=BLOCKSIZ-block_off;• for(i=0;i<(int)(size-block_off)/BLOCKSIZ-1;i++){for(i=0;i<(int)(size-block_off)/BLOCKSIZ-1;i++){• inode->di_addr[block+1+i]=balloc();inode->di_addr[block+1+i]=balloc();• fseek(fd,DATASTART+inode->di_addr[block+1+i] fseek(fd,DATASTART+inode->di_addr[block+1+i]

*BLOCKSIZ,SEEK_SET);*BLOCKSIZ,SEEK_SET);• fwrite(temp_buf,1,BLOCKSIZ,fd);fwrite(temp_buf,1,BLOCKSIZ,fd);• temp_buf+=BLOCKSIZ;temp_buf+=BLOCKSIZ;• }}

Page 32: 第 8 章  文件系统实验

文件系统实验 _ 32 成都信息工程学院 徐虹

图图 8-14 8-14 打开文件打开文件

Page 33: 第 8 章  文件系统实验

文件系统实验 _ 33 成都信息工程学院 徐虹

• if(dinodeid!=(int)NULL){if(dinodeid!=(int)NULL){• printf("\nThe file does not existed!!!\n");printf("\nThe file does not existed!!!\n");• return (int)NULL;}return (int)NULL;}• inode=iget(dinodeid);inode=iget(dinodeid);• if(!access(user_id,inode,openmode)){if(!access(user_id,inode,openmode)){• printf("\nThe file was not accessed !!!\n");printf("\nThe file was not accessed !!!\n");• iput(inode);iput(inode);• return (int)NULL;}return (int)NULL;}• for(i=1;i<SYSOPENFILE;i++)for(i=1;i<SYSOPENFILE;i++)• if(sys_ofile[i].f_count==0) break;if(sys_ofile[i].f_count==0) break;• if(i==SYSOPENFILE){if(i==SYSOPENFILE){• printf("\nThere are too many files to be opend.\printf("\nThere are too many files to be opend.\

n");n");• iput(inode);iput(inode);• return (int)NULL;return (int)NULL;• }}

Page 34: 第 8 章  文件系统实验

文件系统实验 _ 34 成都信息工程学院 徐虹

图图 8-15 8-15 浏览目录浏览目录

Page 35: 第 8 章  文件系统实验

文件系统实验 _ 35 成都信息工程学院 徐虹

for(i=0;i<dir.size;i++){for(i=0;i<dir.size;i++){if(dir.direct[i].d_ino!=DIEMPTY){if(dir.direct[i].d_ino!=DIEMPTY){printf("%sDIRSIZ",dir.direct[i].d_name);printf("%sDIRSIZ",dir.direct[i].d_name);temp_inode=iget(dir.direct[i].d_ino);temp_inode=iget(dir.direct[i].d_ino);di_mode=temp_inode->di_mode;di_mode=temp_inode->di_mode;for(j=0;j<9;j++){for(j=0;j<9;j++){one=di_mode%2;one=di_mode%2;di_mode=di_mode/2;di_mode=di_mode/2;if(one) printf("x");if(one) printf("x");else printf("-");else printf("-");}}if(temp_inode->di_mode&&DIFILE==1){if(temp_inode->di_mode&&DIFILE==1){printf("%ld\n",temp_inode->di_size);printf("%ld\n",temp_inode->di_size);printf("block chain:");printf("block chain:");for(i=0;i<temp_inode->di_size/BLOCKSIZ+1;i++)for(i=0;i<temp_inode->di_size/BLOCKSIZ+1;i++)printf("%4d",temp_inode->di_addr[i]);printf("%4d",temp_inode->di_addr[i]);printf("\n");printf("\n");}}else printf("<dir>\n");else printf("<dir>\n");iput(temp_inode);iput(temp_inode);}}}}

Page 36: 第 8 章  文件系统实验

文件系统实验 _ 36 成都信息工程学院 徐虹

图图 8-16 8-16 创建目录创建目录

Page 37: 第 8 章  文件系统实验

文件系统实验 _ 37 成都信息工程学院 徐虹

• if(dirid!=-1){ // dirid==-1if(dirid!=-1){ // dirid==-1 表示没有该目表示没有该目录名存在录名存在 ;;• inode=iget(dirid);inode=iget(dirid);• if(inode->di_mode&DIDIR)if(inode->di_mode&DIDIR)• printf("\nThe %s directory already printf("\nThe %s directory already

existed!!\n");elseexisted!!\n");else• printf("\n%s is a file name, so the printf("\n%s is a file name, so the

filesystem can not creat a directoryfilesystem can not creat a directory• with the same name",dirname);with the same name",dirname);• iput(inode);iput(inode);• return 0; }return 0; }

Page 38: 第 8 章  文件系统实验

文件系统实验 _ 38 成都信息工程学院 徐虹

图图 8-17 8-17 改变当前目录改变当前目录

Page 39: 第 8 章  文件系统实验

文件系统实验 _ 39 成都信息工程学院 徐虹

if(dirid==-1){if(dirid==-1){printf("\nThe directory %s is not a existed printf("\nThe directory %s is not a existed

directory\n",dirname);directory\n",dirname);return 0;}return 0;}

inode=iget(dirid);inode=iget(dirid);if(!access(user_id,inode,user[user_id].u_default_mode))if(!access(user_id,inode,user[user_id].u_default_mode)){{

printf("\nThe filesystem can not access to the printf("\nThe filesystem can not access to the directory %s",dirname);directory %s",dirname);

iput(inode);iput(inode);return 0;}return 0;}

for(i=0;i<dir.size;i++){for(i=0;i<dir.size;i++){for(j=0;j<DIRNUM;j++){for(j=0;j<DIRNUM;j++){

temp=dir.direct[j].d_ino;temp=dir.direct[j].d_ino;if(dir.direct[j].d_ino==0||if(dir.direct[j].d_ino==0||

dir.direct[j].d_ino>MAX) break;}dir.direct[j].d_ino>MAX) break;}dir.direct[j].d_ino=0;}dir.direct[j].d_ino=0;}

Page 40: 第 8 章  文件系统实验

文件系统实验 _ 40 成都信息工程学院 徐虹

图图 8-18 8-18 用户登录用户登录

Page 41: 第 8 章  文件系统实验

文件系统实验 _ 41 成都信息工程学院 徐虹

for(i=0;i<PWDNUM;i++){for(i=0;i<PWDNUM;i++){ if((uid==pwd[i].p_uid)&&((strcmp(passwd,pwd[i].password)==0)))if((uid==pwd[i].p_uid)&&((strcmp(passwd,pwd[i].password)==0))){{j=0;j=0;while(j<USERNUM){while(j<USERNUM){if(user[j].u_uid==0)if(user[j].u_uid==0) break;break;elseelse j++;j++;}}if(j==USERNUM){if(j==USERNUM){printf("\nThere are too much users in the filesystem, please waite!\printf("\nThere are too much users in the filesystem, please waite!\n");n");return 0;return 0;}}else {else {user[j].u_uid=uid;user[j].u_uid=uid;user[j].u_gid=pwd[i].p_gid;user[j].u_gid=pwd[i].p_gid;user[j].u_default_mode=DEFAULTMODE;user[j].u_default_mode=DEFAULTMODE;}}break;break; }}

}}

Page 42: 第 8 章  文件系统实验

文件系统实验 _ 42 成都信息工程学院 徐虹

int i,j,sys_no;int i,j,sys_no;struct inode*inode;struct inode*inode;for(i=0;i<USERNUM;i++)for(i=0;i<USERNUM;i++)if(uid==user[i].u_uid) break;if(uid==user[i].u_uid) break;if(i==USERNUM){if(i==USERNUM){printf("\nThere is no such a user in filesystem.\n");printf("\nThere is no such a user in filesystem.\n");return (int)NULL;}return (int)NULL;}for(j=0;j<NOFILE;j++){for(j=0;j<NOFILE;j++){if(user[i].u_ofile[j]!=SYSOPENFILE+1){if(user[i].u_ofile[j]!=SYSOPENFILE+1){sys_no=user[i].u_ofile[j];sys_no=user[i].u_ofile[j];inode=sys_ofile[sys_no].f_inode;iput(inode);inode=sys_ofile[sys_no].f_inode;iput(inode);sys_ofile[sys_no].f_count--;sys_ofile[sys_no].f_count--;

user[i].u_ofile[j]=SYSOPENFILE+1user[i].u_ofile[j]=SYSOPENFILE+1}}}}

Page 43: 第 8 章  文件系统实验

文件系统实验 _ 43 成都信息工程学院 徐虹 图 8-19 注销用户 图 8-20 安装文件系统

Page 44: 第 8 章  文件系统实验

文件系统实验 _ 44 成都信息工程学院 徐虹

printf("install\n");printf("install\n");fd=fopen("filesystem","a+b");fd=fopen("filesystem","a+b");if(fd==NULL){if(fd==NULL){

printf("\nFilesys can not be printf("\nFilesys can not be loaded.\n");loaded.\n");

exit(0);}exit(0);}fseek(fd,BLOCKSIZ,SEEK_SET);fseek(fd,BLOCKSIZ,SEEK_SET);fread(&filsys,1,sizeof(struct fread(&filsys,1,sizeof(struct filsys),fd);filsys),fd);i=filsys.s_free[49];i=filsys.s_free[49];

for(i=0;i<NHINO;i++)for(i=0;i<NHINO;i++)

Page 45: 第 8 章  文件系统实验

文件系统实验 _ 45 成都信息工程学院 徐虹

图图 8-21 8-21 退出文件系统退出文件系统

Page 46: 第 8 章  文件系统实验

文件系统实验 _ 46 成都信息工程学院 徐虹

halt(){int i,j;halt(){int i,j;for(i=0;i<USERNUM;i++){for(i=0;i<USERNUM;i++){

if(user[i].u_uid!=0){if(user[i].u_uid!=0){for(j=0;j<NOFILE;j++){for(j=0;j<NOFILE;j++){

if(user[i].u_ofile[j]!if(user[i].u_ofile[j]!=SYSOPENFILE+1){=SYSOPENFILE+1){

close(user[i].u_ofile[j]);close(user[i].u_ofile[j]);

user[i].u_ofile[j]=SYSOPENFILE+1;}}}}user[i].u_ofile[j]=SYSOPENFILE+1;}}}}fseek(fd,BLOCKSIZ,SEEK_SET);fseek(fd,BLOCKSIZ,SEEK_SET);fwrite(&filsys,1,sizeof(struct filsys),fd);fwrite(&filsys,1,sizeof(struct filsys),fd);fclose(fd);fclose(fd);printf("\nGood bye. See you next time. Please turn off printf("\nGood bye. See you next time. Please turn off the switch.\n");exit(0)}the switch.\n");exit(0)}

8.4.4 8.4.4 程序说明程序说明