




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验5Linux文件管理一、实验目的1.掌握Linux文件系统的基本原理、结构和实现方法2.掌握Linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用3.学会设计简单的文件系统并实现一组操作4.通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握二、实验内容设计并实现一个一级文件系统程序,要求实现以下功能:1.提供文件创建/删除接口命令create / delete、目录创建/删除接口命令mkdir / rmdir、显示目录内容命令ls等。2.创建的文件不要求格式和内容。三、实验结果1.程序源代码main.cpp#include <stdio.h>
2、;#include <malloc.h>#include <stdlib.h>#include <string.h>#include "structure.h"#include "creat.h"#include "access.h"#include "ballfre.h"#include "close.h"#include "delete.h"#include "dir.h"#include "format.
3、h"#include "halt.h"#include "iallfre.h"#include "install.h"#include "log.h"#include "name.h"#include "open.h"#include "rdwt.h"#include "igetput.h"struct hinode hinodeNHINO;struct dir dir;struct file sys_ofileSYSOPEN
4、FILE;struct filsys filsys;struct pwd pwdPWDNUM;struct user userUSERNUM;FILE *fd;struct inode *cur_path_inode;int user_id;/*kkkkk*/unsigned short usr_id;char usr_p12;char sel;char temp_dir12;main() unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j; char *buf; int done=1; printf("nDo you want to for
5、mat the disk(y or n)?n"); if(getchar()='y') printf("nFormat will erase all context on the disk n"); printf("Formating.n"); format(); printf("nNow will install the fillsystem,please wait.n"); install(); printf("n-Login-nPlease input your userid:");
6、 scanf("%u",&usr_id); printf("nPlease input your password:"); scanf("%s",&usr_p); /* printf("nsuccessn");*/ if(!login(usr_id,usr_p) return; while(done) printf("n Please Select Your Operatingn"); printf(" -1-lsn -2-mkdirn -3-change dirn -
7、4-create filen -0-Logoutn");/* */ sel=getchar(); sel=getchar(); switch(sel) case '1': _dir(); break; case '2': printf("please input dir name:"); scanf("%s",temp_dir); mkdir(temp_dir); break; case '3': printf("please input dir name:"); scanf(
8、"%s",temp_dir); chdir(temp_dir); break; case '4': printf("please input file name:"); scanf("%s",temp_dir); ab_fd1=creat(2118,temp_dir,01777); buf=(char *)malloc(BLOCKSIZ*6+5); write(ab_fd1,buf,BLOCKSIZ*6+5); close(0,ab_fd1); free(buf); break; case '0': l
9、ogout(usr_id); halt(); done = 0; default: printf("error!nNo such command,please try again.nOr you can ask your teacher for help.n"); break; else printf("User canselednGood Byen");structure.h#ifndef _STRUCTURE_H#define _STRUCTURE_H#define MAX 32767#define BLOCKSIZ 512#define SYSOP
10、ENFILE 40#define DIRNUM 128#define DIRSIZ 14#define PWDSIZ 12#define PWDNUM 32#define NOFILE 20#define NADDR 10#define NHINO 128#define USERNUM 10#define DINODESIZ 72#define DINODEBLK 32#define FILEBLK 512#define NICFREE 50#define NICINOD 50#define DINODESTART 1024#define DATASTART (2+DINODEBLK)*BLO
11、CKSIZ#define DIEMPTY00000#define DIFILE01000#define DIDIR02000#define UDIREAD00001#define UDIWRITE00002#define UDIEXICUTE00004#define GDIREAD00010#define GDIWRITE00020#define GDIEXICUTE00040#define ODIREAD00100#defineODIWRITE00200#define ODIEXICUTE00400#define READ1#define WRITE2#defineEXICUTE3#defi
12、ne DEFAULTMODE 00777#define IUPDATE00002#defineSUPDATE00001#define FREAD00001#define FWRITE 00002#define FAPPEND 00004#define DISKFULL 65535#define SEEK_SET 0struct inode struct inode *i_forw; struct inode *i_back; char i_flag; unsigned int i_ino; unsigned int i_count; unsigned int di_addrNADDR; uns
13、igned short di_number; unsigned short di_mode; unsigned short di_uid; unsigned short di_gid; unsigned short di_size;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_addrNADDR;struct direct char d_name
14、DIRSIZ; unsigned int d_ino;struct filsys unsigned short s_isize; unsigned long s_fsize; unsigned int s_nfree; unsigned short s_pfree; unsigned int s_freeNICFREE; unsigned int s_ninode; unsigned short s_pinode; unsigned int s_inodeNICINOD; unsigned int s_rinode; char s_fmod;struct pwd unsigned short
15、p_uid; unsigned short p_gid; char passwordPWDSIZ;struct dir struct direct directDIRNUM; int size;struct hinode struct inode *i_forw;struct file char f_flag; unsigned int f_count; struct inode *f_inode; unsigned long f_off;struct user unsigned short u_default_mode; unsigned short u_uid; unsigned shor
16、t u_gid; unsigned short u_ofileNOFILE;extern struct inode* aaa;extern struct hinode hinodeNHINO;extern struct dir dir;extern struct file sys_ofileSYSOPENFILE;extern struct filsys filsys;extern struct pwd pwdPWDNUM;extern struct user userUSERNUM;extern struct inode *cur_path_inode;extern FILE *fd;ext
17、ern int user_id;extern struct inode *iget();extern iput();extern unsigned int balloc();extern bfree();extern struct inode *ialloc();extern ifree();extern int namei();extern short iname();extern unsigned int access();extern _dir();extern mkdir();extern chdir();extern unsigned short open();extern crea
18、te();extern unsigned int read();extern unsigned int write();extern int login();extern logout();extern install();extern format();extern close();extern halt();#endifaccess.h#include <stdio.h>#include "structure.h"unsigned int access(user_id,inode,mode)unsigned int user_id;struct inode
19、*inode;unsigned short mode; switch(mode) case READ: if(inode->di_mode&ODIREAD) return 1; if(inode->di_mode&GDIREAD)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIREAD)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; case WRITE:
20、if(inode->di_mode&ODIWRITE) return 1; if(inode->di_mode&GDIWRITE)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIWRITE)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; case EXICUTE: if(inode->di_mode&ODIEXICUTE) return 1;
21、if(inode->di_mode&GDIEXICUTE)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIEXICUTE)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; default: return 1; ballfre.h#include <stdio.h>#include "structure.h"static unsigned in
22、t block_bufBLOCKSIZ/sizeof(int);unsigned int balloc() unsigned int free_block; int i,flag; if(filsys.s_nfree=0) printf("nDisk Full!n"); return DISKFULL; i=filsys.s_pfree; flag=(i=0); if(flag) /该BLOCK组全部用了 fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_freeNICFREE-1+1),SEEK_SET); /filsys.s_freeNICFR
23、EE-1+1指向下一个block组的地址块 fread(block_buf,1,BLOCKSIZ,fd); for(i=0; i<NICFREE; i+) filsys.s_freei=block_bufi; /将待用block组的地址读入超级块 filsys.s_pfree=NICFREE-1; free_block=filsys.s_freefilsys.s_pfree; else free_block=filsys.s_freefilsys.s_pfree; filsys.s_pfree-; filsys.s_nfree-; filsys.s_fmod=SUPDATE; retur
24、n free_block;bfree (unsigned int block_num) int i; if(filsys.s_pfree=NICFREE-1) /表示回收的block已经可以组成一个block组了 for(i=0; i<NICFREE; i+) block_bufi=filsys.s_freeNICFREE-1-i; filsys.s_pfree=0; fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free0),SEEK_SET); /filsys.s_free0为当前BLOCK组的地址块 fwrite(block_buf,1,BLOCKSI
25、Z,fd); else filsys.s_pfree+; filsys.s_nfree+; filsys.s_fmod=SUPDATE;close.h#include <stdio.h>#include "structure.h"close(user_id,cfd)unsigned int user_id;unsigned short cfd; struct inode *inode; inode=sys_ofileuseruser_id.u_ofilecfd.f_inode; iput(inode); sys_ofileuseruser_id.u_ofilec
26、fd.f_count-; useruser_id.u_ofilecfd=SYSOPENFILE+1;creat.hcreat(uid,filename,mode)unsigned int uid;char *filename;unsigned short mode; int di_ith,di_ino; struct inode *inode; int i,j; i=0; while(i<USERNUM)/user的值由函数login()注册,参看文件log.h if(useri.u_uid=uid) user_id=i; break; i+; if(i=USERNUM) printf(
27、"the user id is wrong.n"); exit(1); di_ino=namei(filename); if(di_ino!=-1)/文件已经存在 inode=iget(di_ino); if(access(user_id,inode,mode)=0) iput(inode); printf("ncreat access not allowedn"); return 0; for(i=0; i<inode->di_size/BLOCKSIZ+1; i+) bfree(inode->di_addri); for(i=0;
28、i<SYSOPENFILE; i+) if(sys_ofilei.f_inode=inode) sys_ofilei.f_off=0; for(i=0; i<NOFILE; i+) if(useruser_id.u_ofilei=SYSOPENFILE+1) useruser_id.u_uid=inode->di_uid; useruser_id.u_gid=inode->di_gid; for(j=0; j<SYSOPENFILE; i+) if(sys_ofilej.f_count=0) useruser_id.u_ofilei=j; sys_ofilej.f
29、_flag=(char)mode; return i; else inode=ialloc(); di_ith=iname(filename); dir.size+; dir.directdi_ith.d_ino=inode->i_ino; inode->di_mode=useruser_id.u_default_mode; inode->di_uid=useruser_id.u_uid; inode->di_gid=useruser_id.u_gid; inode->di_size=0; inode->di_number=0; for(i=0; i<
30、SYSOPENFILE; i+) if(sys_ofilei.f_count=0) break; for(j=0; j<NOFILE; i+) if(useruser_id.u_ofilej=SYSOPENFILE+1) break; useruser_id.u_ofilej=i; sys_ofilei.f_flag=(char)mode; sys_ofilei.f_count=0; sys_ofilei.f_off=0; sys_ofilei.f_inode=inode; return j; return 0;delete.h#include <stdio.h>#inclu
31、de "structure.h"delete(char *filename)unsigned int dinodeid;struct inode *inode;dinodeid=namei(filename);if(dinodeid!=(int)NULL)inode=iget(dinodeid);inode->di_number-;iput(inode);dir.h_dir()unsigned int di_mode;int i,j,one;struct inode *temp_inode;printf("CURRENT DIRECTORY:n")
32、;for(i=0;i<dir.size;i+)if(dir.directi.d_ino!=DIEMPTY)printf("%sDIRSIZ",dir.directi.d_name);temp_inode=iget(dir.directi.d_ino);di_mode=temp_inode->di_mode;for(j=0;j<9;j+)one=di_mode%2;di_mode=di_mode/2;if(one) printf("x");else printf("-");if(temp_inode->di_mo
33、de&&DIFILE=1)printf("%ldn",temp_inode->di_size);printf("block chain:");for(i=0;i<temp_inode->di_size/BLOCKSIZ+1;i+)printf("%4d",temp_inode->di_addri);printf("n");else printf("<dir>n");iput(temp_inode);mkdir(char *dirname)int
34、 dirid,dirpos;struct inode *inode;struct direct bufBLOCKSIZ/(DIRSIZ+2);unsigned int block;dirid=namei(dirname);if(dirid!=-1)/dirid=-1表示没有该目录名存在;inode=iget(dirid);if(inode->di_mode&DIDIR)printf("n%s directory already existed!n");elseprintf("n%s is a file name&can not creat a
35、 dir the same name",dirname);iput(inode);return 0;dirpos=iname(dirname);inode=ialloc();inode->i_ino=dirpos;dir.directdirpos.d_ino=inode->i_ino;dir.size+;strcpy(buf0.d_name,".");buf0.d_ino=dirid;strcpy(buf1.d_name,".");buf1.d_ino=cur_path_inode->i_ino;block=balloc();
36、fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);fwrite(buf,1,BLOCKSIZ,fd);inode->di_size=2*(DIRSIZ+2);inode->di_number=1;inode->di_mode=useruser_id.u_default_mode;inode->di_uid=useruser_id.u_uid;inode->di_gid=useruser_id.u_gid;inode->di_addr0=block;iput(inode);return 0;chdir(char *dirn
37、ame)int dirid;int temp;struct inode *inode;short block;int i,j,low=0,high=0;dirid=namei(dirname);if(dirid=#include <stdio.h>#include "structure.h"delete(char *filename)unsigned int dinodeid;struct inode *inode;dinodeid=namei(filename);if(dinodeid!=(int)NULL)inode=iget(dinodeid);inode
38、->di_number-;iput(inode);=-1)printf("n%s does not existedn",dirname);return 0;inode=iget(dirid);if(!access(user_id,inode,useruser_id.u_default_mode)printf("nhas not access to the directory %s",dirname);iput(inode);return 0;for(i=0;i<dir.size;i+)for(j=0;j<DIRNUM;j+)temp=d
39、ir.directj.d_ino;if(dir.directj.d_ino=0|dir.directj.d_ino>MAX) break;dir.directj.d_ino=0;for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1;i+)bfree(cur_path_inode->di_addri);i=dir.size;for(i=0;i<dir.size;i+=BLOCKSIZ/(DIRSIZ+2)block=balloc();cur_path_inode->di_addri=block;fseek(fd,DATAST
40、ART+block*BLOCKSIZ,SEEK_SET);fwrite(&dir.directi,1,BLOCKSIZ,fd);cur_path_inode->di_size=dir.size*(DIRSIZ+2);iput(cur_path_inode);cur_path_inode=inode;i=inode->di_size/BLOCKSIZ+1;j=0;for(i=0;i<inode->di_size/BLOCKSIZ+1;i+)fseek(fd,DATASTART+inode->di_addri*BLOCKSIZ,SEEK_SET);fread(
41、&dir.directj,1,BLOCKSIZ,fd);j+=BLOCKSIZ/(DIRSIZ+2);return 0;format.hformat() struct inode *inode;struct direct dir_bufBLOCKSIZ/(DIRSIZ+2);struct pwd passwdBLOCKSIZ/(PWDSIZ+4);struct filsys filsys;unsigned int block_bufBLOCKSIZ/sizeof(int);char *buf;char *empty;int i,j,k;fd=fopen("filesystem
42、","w+b");buf=(char*)malloc(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char);if(fd=NULL)printf("nfile system file creat failed!n");exit(0);fseek(fd,0,SEEK_SET);fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);free(buf);passwd0.p_uid=2116;passwd0.p_gid=03;strcpy(passwd0.
43、password,"don1");passwd1.p_uid=2117;passwd1.p_gid=03;strcpy(passwd1.password,"don2");passwd2.p_uid=2118;passwd2.p_gid=04;strcpy(passwd2.password,"abcd");passwd3.p_uid=2119;passwd3.p_gid=04;strcpy(passwd3.password,"don4");passwd4.p_uid=2220;passwd4.p_gid=05;str
44、cpy(passwd4.password,"don5");inode=iget(0);inode->di_mode=DIEMPTY;iput(inode);inode=iget(1);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr0=0;strcpy(dir_buf0.d_name,".");dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,".
45、");dir_buf1.d_ino=1;strcpy(dir_buf2.d_name,"etc");dir_buf2.d_ino=2;fseek(fd,DATASTART,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);fseek(fd,1056,SEEK_SET);fread(inode,DINODESIZ,1,fd);inode=iget(1);iput(inode);inode=iget(2);inode->di_number=1;inode->di_mode=DEFAULTMODE
46、|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr0=1;strcpy(dir_buf0.d_name,".");dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,".");dir_buf1.d_ino=2;strcpy(dir_buf2.d_name,"password");dir_buf2.d_ino=3;fseek(fd,DATASTART+BLOCKSIZ*1,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2)
47、,fd);iput(inode);inode=iget(3);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIFILE;inode->di_size=BLOCKSIZ;inode->di_addr0=2;for(i=5;i<PWDNUM;i+)passwdi.p_uid=0;passwdi.p_gid=0;strcpy(passwdi.password," ");fseek(fd,DATASTART+2*BLOCKSIZ,SEEK_SET);fwrite(passwd,1,BLOCKSIZ,fd)
48、;iput(inode);filsys.s_isize=DINODEBLK;filsys.s_fsize=FILEBLK;filsys.s_ninode=DINODEBLK*BLOCKSIZ/DINODESIZ-4;filsys.s_nfree=FILEBLK-3;for(i=0;i<NICINOD;i+)filsys.s_inodei=4+i;filsys.s_pinode=0;filsys.s_rinode=NICINOD+4;for(i=NICFREE+2;i<FILEBLK;i+=50)/为何要加2,参看149行的注释for(j=0;j<NICFREE;j+)block_bufNICFREE-1-j=i-j;fseek(fd,DATASTART+BLOCKSIZ*(i-49),SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);/当i=502之后,完成文件块502453的写入; /之后文件块512503不能进行,需要特殊处理for(i=503;i<512;i+)block_bufi-503=i;fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);fwrite(block_buf,1,BLOCKS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年学历类自考专业(小学教育)中外教育简史-美育基础参考题库含答案解析(5套)
- 2025年学历类自考专业(学前教育)学前特殊儿童教育-学前特殊儿童教育参考题库含答案解析(5套)
- 2025年学历类自考专业(学前教育)学前儿童体育教育-幼儿园教育活动设计与组织参考题库含答案解析(5套)
- 2025年学历类自考专业(公共关系)新闻学概论-广告运作策略参考题库含答案解析(5套)
- 2025年学历类自考专业(公共关系)企业文化-创新思维理论与方法参考题库含答案解析(5套)
- 2025年医卫类药学(中级)专业知识-基础知识参考题库含答案解析(5套)
- 2026届甘肃省合水县一中化学高二上期末综合测试试题含答案
- 2026届贵州省毕节市梁才学校化学高一第一学期期中质量跟踪监视试题含解析
- 2026届内蒙古阿左旗高级中学化学高三上期中复习检测模拟试题含解析
- 2026届河北省石家庄二中雄安校区安新中学高二化学第一学期期末检测试题含答案
- 韩语考试题目及答案
- 矿业公司采矿管理制度
- 新疆维吾尔自治区国际创伤生命支持ITLS职业考试试卷与答案
- 新生儿多重耐药菌防控
- 非标设备公司采购管理制度
- 2025年的基层治理理论与实践考核试卷及答案
- 2025年江西省高考物理真题
- 甘肃白银有色集团股份有限公司招聘考试真题2024
- 第三届全国技能大赛竞赛-工业机器人系统操作赛项选拔赛备考试题库(附答案)
- 外贸合伙人合同协议书
- 2025黑龙江省农业投资集团有限公司选聘12人笔试参考题库附带答案详解
评论
0/150
提交评论