实验三 文件系统实验
操作系统实验实验报告
操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统实验报告6
操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
文件系统实验报告
文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。
二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。
本实验中用到的是RS-232C标准的接口。
(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。
对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。
保存好设置后以后可以不用再设置。
(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。
可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。
注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。
(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。
由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。
进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。
再设置完后要重新启动tftp服务。
文件系统实验
6.1 二级目录文件系统设计6.1.1 目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
6.1.2 实验内容为DOS系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令LOGIN 用户登陆DIR 列文件目录CREATE 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件(2)列目录时要列出文件名,物理地址,保护码和文件长度。
(3)源文件可以进行读写保护。
6.1.3 实验环境(1)PC兼容机(2)Windows、DOS系统(3)TC语言6.1.4 实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
6.1.5 实验参考代码参考程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):#include "stdio.h"#include "string.h"#include "conio.h"#include "stdlib.h"#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/ char fname[MAXNAME]; /*file name*/} OSFILE;typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files*/OSUFD_LOGIN ufd_lp;int ucount=0; /*the count of mfd's ufds*/int fcount[MAXCHILD]; /*the count of ufd's files*/int loginsuc=0; /*whether login successfully*/char username[MAXNAME]; /*record login user's name22*/char dirname[MAXNAME];/*record current directory*/int fpaddrno[MAX]; /*record file physical address num*/OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/ int wgetchar; /*whether getchar()*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;void main(){int i,j,choice1;char choice[50]; /*choice operation:dir,create,delete,open,delete,modify,read,write*/ int choiceend=1; /*whether choice end*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CdF(); /*Change Dir*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem*/void help();if((fp_mfd=fopen("c:\\osfile\\mfd","rb"))==NULL){fp_mfd=fopen("c:\\osfile\\mfd","wb");fclose(fp_mfd);}for(i=0;i<MAX;i++) fpaddrno[i]=0;// textattr(BLACK*16|WHITE);system("cls");// clrscr(); /*clear screen*/LoginF(); /*user login*///clrscr();system("cls");if(loginsuc==1) /*Login Successfully*/{while (1){wgetchar=0;if (choiceend==1){printf("\n\nC:\\%s>",strupr(dirname));} //strupr将所有小写字母转换成大写else printf("Bad command or file name.\nC:\\%s>",strupr(username));gets(choice);strcpy(choice,ltrim(rtrim(strlwr(choice)))); //strlwr将所有大写字母转换成小写if (strcmp(choice,"dir")==0) choice1=1;else if(strcmp(choice,"creat")==0) choice1=2;else if(strcmp(choice,"delete")==0) choice1=3;else if(strcmp(choice,"attrib")==0) choice1=4;else if(strcmp(choice,"open")==0) choice1=5;else if(strcmp(choice,"close")==0) choice1=6;else if(strcmp(choice,"read")==0) choice1=7;else if(strcmp(choice,"modify")==0) choice1=8;else if(strcmp(choice,"exit")==0) choice1=9;else if(strcmp(choice,"cls")==0) choice1=10;else if(strcmp(choice,"cd")==0) choice1=11;else if(strcmp(choice,"help")==0) choice1=20;else choice1=12;switch(choice1){case 1:DirF();choiceend=1;break;case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break;case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break;case 5:choiceend=1;OpenF();if (!wgetchar) getchar();break;case 6:choiceend=1;CloseF();if (!wgetchar) getchar();break;case 7:choiceend=1;ReadF();if (!wgetchar) getchar();break;case 8:choiceend=1;WriteF();if (!wgetchar) getchar();break;case 9:printf("\nYou have exited this system.");QuitF();exit(0);break;case 10:choiceend=1; system("cls"); /*clrscr();*/break;case 11:CdF();choiceend=1;break;case 20:help();choiceend=1;break;default:choiceend=0;}}}else printf("\nAccess denied.");}void help(void){printf("\nThe Command List\n");printf("\nCd Attrib Creat Modify Read Open Cls Delete Exit Close\n"); }char *rtrim(char *str) /*remove the trailing blanks.*/{int n=strlen(str)-1;while(n>=0){if(*(str+n)!=' '){*(str+n+1)='\0';break;}else n--;}if (n<0) str[0]='\0';return str;}char *ltrim(char *str) /*remove the heading blanks.*/{char *rtrim(char *str);strrev(str); //将所有字母反向排列rtrim(str);strrev(str);return str;}void LoginF() /*LOGIN FileSystem*/{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];int i,j,flag=1;char a[25];int findout; /*login user not exist*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/void SetPANo(int RorW); /*Set physical address num*/while(1){findout=0;printf("\n\nLogin Name:");gets(loginame);ltrim(rtrim(loginame));fp_mfd=fopen("c:\\osfile\\mfd","rb");for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++)if (strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0){findout=1;strcpy(logincpw,ufd_lp.ufdpword);}fclose(fp_mfd);if (findout==1) /*user exist*/{printf("Login Password:");InputPW(loginpw); /*input password,use '*' replace*/if (strcmp(loginpw,logincpw)==0){strcpy(username,strupr(loginame));strcpy(dirname,username);fp_mfd=fopen("c:\\osfile\\mfd","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++){strcpy(str,"c:\\osfile\\");strcat(str,ufd_lp.ufdname); //strcat字符串连接函数ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));fp_ufd=fopen(str,"rb");fcount[j]=0;for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++){ifopen[j][i].ifopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLogin successful! Welcome to this FileSystem\n\n");loginsuc=1;return;}else{printf("\n\n");flag=1;while(flag){printf("Login Failed! Password Error. Try Again(Y/N):");gets(a);ltrim(rtrim(a));if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}}}}else{printf("New Password(<=8):");InputPW(loginpw); /*input new password,use '*' replace*/printf("\nConfirm Password(<=8):"); /*input new password,use '*' replace*/ InputPW(logincpw);if (strcmp(loginpw,logincpw)==0){strcpy(ufd_lp.ufdname,strupr(loginame));strcpy(ufd_lp.ufdpword,loginpw);fp_mfd=fopen("c:\\osfile\\mfd","ab");fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd);fclose(fp_mfd);strcpy(username,strupr(loginame));strcpy(dirname,loginame);strcpy(str,"c:\\osfile\\");strcat(str,username);if((fp_ufd=fopen(str,"rb"))==NULL){fp_ufd=fopen(str,"wb");fclose(fp_ufd);}fp_mfd=fopen("c:\\osfile\\mfd","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++) {strcpy(str,"c:\\osfile\\");strcat(str,ufd_lp.ufdname);ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));fp_ufd=fopen(str,"rb");for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++){ifopen[j][i].ifopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLogin Successful! Welcome to this System\n\n");loginsuc=1;return;}else{printf("\n\n");flag=1;while(flag){printf("Login Failed! Password Error. Try Again(Y/N):");gets(a);ltrim(rtrim(a));if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}}}}}}void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/{int i,j;if (RorW==0){if((fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"))==NULL){fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");fclose(fp_file_p);}fp_file_p=fopen("c:\\osfile\\file\\file_p","rb");for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++)fpaddrno[j]=1;/*for(i=1;i<MAX;i++)if ((i%13)==0) fpaddrno[i]=1;*/}else{fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*for(i=1;i<MAX;i++)if((i%13)==0) fpaddrno[i]=0;*/for(i=0;i<MAX;i++)if (fpaddrno[i]==1)fwrite(&i,sizeof(int),1,fp_file_p);}fclose(fp_file_p);}void InputPW(char *password) /*input password,use '*' replace*/{int j;for(j=0;j<=7;j++){password[j]=getch();if ((int)(password[j])!=13){if((int)(password[j])!=8)putchar('*');else{if (j>0){j--;j--;putchar('\b');putchar(' ');putchar('\b');}else j--;}}else{password[j]='\0';break;}}password[j]='\0';}void DirF() /*Dir FileSystem*/{int i,j,count=0;char sfmode[25],sfpaddr[25],str[25];int ExistD(char *dirname); /*Whether DirName Exist,Exist-i,Not Exist-0*///clrscr();system("cls");if (strcmp(strupr(ltrim(rtrim(dirname))),"")!=0){printf("\n\nC:\\%s>dir\n",dirname);printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); j=ExistD(dirname);for(i=0;i<fcount[j];i++){if ((i%16==0)&&(i!=0)){printf("\nPress any key to continue..");getch();//clrscr();system("cls");printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode");}itoa(ufd[j]->ufdfile[i].fpaddr,str,10);strcpy(sfpaddr,"file");strcat(sfpaddr,str);if (ufd[j]->ufdfile[i].fmode==0) strcpy(sfmode,"Read Only");else if(ufd[j]->ufdfile[i].fmode==1) strcpy(sfmode,"Write Only");else if(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"Read And Write");else strcpy(sfmode,"Protect");printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength," <FILE>",sfmode);}printf("\n %3d file(s)\n",fcount[j]);}else{printf("\n\nC:\\>dir\n");printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");for(i=0;i<ucount;i++){if ((i%16==0)&&(i!=0)){printf("\nPress any key to continue...");getch();// clrscr();system("cls");printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");}printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");count=count+fcount[i];}printf("\n %3d dir(s),%5d file(s)\n",ucount,count);}}int ExistD(char *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/{int i;int exist=0;for(i=0;i<ucount;i++)if (strcmp(strupr(ufd[i]->ufdname),strupr(dirname))==0){exist=1;break;}if (exist) return(i);else return(-1);}void CdF() /*Exchange Dir*/{char dname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistD(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/printf("\nPlease input DirName (cd..-Previous dir; DirNAME-cd [DirNAME]):");gets(dname);ltrim(rtrim(dname));if (ExistD(dname)>=0) strcpy(dirname,strupr(dname));else if(strcmp(strupr(dname),"CD..")==0) strcpy(ltrim(rtrim(dirname)),"");else printf("\nError.\'%s\' does not exist.\n",dname);}void CreateF() /*Create File*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];char fmode[25];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int FindPANo(); /*find out physical address num*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You must create file in your own dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));if (ExistF(fname)>=0){printf("\nError. Name \'%s\' has already existed.\n",fname);wgetchar=1;}else{printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode,"3") ==0)){fpaddrno=FindPANo();if (fpaddrno>=0){i=ExistD(username);strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"c:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Input text now(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();flag=0;}else if(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}}printf("\n\'%s\' has been created successfully!\n",fname);}else{printf("\nFail!No Disk Space. Please format your disk.\n");wgetchar=1;} }else {printf("\nError. FileMode\'s Range is 0-3\n");wgetchar=1;} }}}int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/ {int i,j;int exist=0;int ExistD(char *dirname);j=ExistD(dirname);for(i=0;i<fcount[j];i++)if (strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0) {exist=1;break;}if (exist) return(i);else return(-1);}int FindPANo() /*find out physical address num*/{int i;for(i=0;i<MAX;i++)if (fpaddrno[i]==0) {fpaddrno[i]=1;break;}if (i<MAX) return(i);else return(-1);}int WriteF1() /*write file*/{int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if (c!='\n') length++;}fprintf(fp_file,"\n");fclose(fp_file);return(length);}void DeleteF() /*Delete File*/{char fname[MAXNAME];char str[50],str1[50];int i,j,k,flag=1;char a[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/ int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You can only delete file in your own dir.\n");wgetchar=1;} else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError. \'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;} else{while(flag){printf("\'%s\' will be deleted. Are you sure(Y/N):",fname);gets(a);ltrim(rtrim(a));if(strcmp(strupr(a),"Y")==0){fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;itoa(ufd[k]->ufdfile[i].fpaddr,str,10);for(j=i;j<fcount[k]-1;j++){strcpy(ufd[k]->ufdfile[j].fname,ufd[k]->ufdfile[j+1].fname);ufd[k]->ufdfile[j].fpaddr=ufd[k]->ufdfile[j+1].fpaddr;ufd[k]->ufdfile[j].flength=ufd[k]->ufdfile[j+1].flength;ufd[k]->ufdfile[j].fmode=ufd[k]->ufdfile[j+1].fmode;ifopen[k][j]=ifopen[k][j+1];}fcount[k]--;strcpy(str1,"c:\\osfile\\file\\file");strcat(str1,str);remove(str1);flag=0;printf("\n\'%s\' has been deleted successfully.\n",fname);wgetchar=1;}else if(strcmp(strupr(a),"N")==0){printf("\nError. \'%s\' hasn\'t been deleted.\n",fname);wgetchar=1;flag=0;}}}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}void ModifyFM() /*Modify FileMode*/{char fname[MAXNAME],str[50];int i,j,k,flag;char fmode[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/void SetPANo(int RorW); /*Set physical address num*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0) {printf("\nError.You can only modify filemode in yourself dir.\n");wgetchar=1;}else{ printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError.\'%s\' is in open status. Close it before modify.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==0) strcpy(str,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str,"read and write");else strcpy(str,"Protect");printf("\'%s\' filemode is %s.\n",fname,strupr(str));printf("Modify to(0-read only,1-write only,2-read and write,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if(strcmp(fmode,"0")==0){ufd[k]->ufdfile[i].fmode=0;printf("\n\'%s\' has been modified to READ ONLY mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"1")==0){ufd[k]->ufdfile[i].fmode=1;printf("\n\'%s\' has been modified to WRITE ONLY mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"2")==0){ufd[k]->ufdfile[i].fmode=2;printf("\n\'%s\' has been modified to READ AND WRITE mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"3")==0){ufd[k]->ufdfile[i].fmode=3;printf("\n\'%s\' has been modified to FORBID mode successfully.\n",fname);wgetchar=1;}else {printf("\nError.\'%s\' is not modified.\n",fname);wgetchar=1;}}}else{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}void OpenF() /*Open File*/{char fname[MAXNAME];char str[25],str1[25],fmode[25];int i,k;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please change to ufd dir before open.\n");wgetchar=1;return;}printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(dirname);if(!ifopen[k][i].ifopen){if (ufd[k]->ufdfile[i].fmode==3){printf("\nError. The file\'s mode is FORBID. Can not open.\n");wgetchar=1;}else{printf("Please input FileOpenMode(0-Read Only,1-Write Only,2-Read and Write):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)){if(fmode[0]=='0') /*open file with read only mode*/{strcpy(str,"read only");if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='1') /*open file with write only mode*/{strcpy(str,"write only");if((ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='2') /*open file with read and write mode*/{strcpy(str,"read and write");if(ufd[k]->ufdfile[i].fmode==2) ifopen[k][i].ifopen=1;}if(ufd[k]->ufdfile[i].fmode==0) strcpy(str1,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str1,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str1,"read and write");if(ifopen[k][i].ifopen==1){ifopen[k][i].openmode=atoi(fmode);if (ifopen[k][i].openmode==0) strcpy(str,"read only");else if(ifopen[k][i].openmode==1) strcpy(str,"write only");else if(ifopen[k][i].openmode==2) strcpy(str,"read and write");printf("\n\'%s\' has been opened. OpenMode is %s,FileModeis %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}else{printf("\nError. \'%s\' hasn\'t been opened. OpenMode Error. OpenMode is %s,but FileMode is %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}}else {printf("\nError. FileOpenMode\'s Range is 0-2\n");wgetchar=1;}}}else {printf("\nError. \'%s\' is in open status.\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}void CloseF() /*Close File*/{int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please convert to ufd dir before close.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) In This Ufd:\n");/*display openned file*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) {printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\n\'%s\' has been closed successfully.\n",fname);wgetchar=1;}else {printf("\nError.\'%s\' is in closing status.\n",fname);wgetchar=1;}}else {printf("\nError. \'%s\' is not exist.\n",fname);wgetchar=1;}}}void ReadF() /*Read File*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError.Please convert to ufd dir before read.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThe text is:\n\n");printf(" ");while(fscanf(fp_file,"%c",&c)!=EOF)if (c=='\n') printf("\n ");else printf("%c",c);printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}else{printf("\nError.\'%s\' has been opened with WRITE ONLY mode. It isn\'tread.\n",fname);wgetchar=1;}}else {printf("\nError.\'%s\' is in closing status. Please open it before read\n",fname);wgetchar=1;} }else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}void WriteF() /*Write File*/{int i,k,n=0;char fname[MAXNAME];char str[50],str1[50],a[50];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);int WriteF1(); /*write file*/if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError. Please convert to ufd dir before write.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) with write only mode or read and write mode:\n");/*display openned files with writable mode*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}。
实验三 Linux操作系统安全实验 (一)
实验三Linux操作系统安全一、实验目的及要求(一)实验目的通过实验熟悉Linux环境下的用户管理、进程管理以及文件管理的相关操作命令。
掌握linux操作系统中相关的系统安全配置方法,建立linux操作系统的基本安全框架。
(二)实验要求根据实验中介绍的Linux操作系统的各项安全性实验要求,详细观察记录设置前后系统的变化,给出分析报告。
使用RPM对系统的软件进行管理,验证系统内软件的完整性,并分析结果。
试比较Linux下网了服务安全设置与Windows下安全设置异同。
二、实验环境安装Red hat9.0操作系统的计算机一台三、实验内容1、账户和口令安全2、文件系统管理安全3、查看和更改PAM模块设置4、RPM软件管理5、系统安全配置四、实验步骤任务一账户和口令安全1、查看和添加账户(1)在X_Windows窗口中单击鼠标右键,选择“信件中断”,输入下面的命令行:[root@localhost root]#useradd mylist利用useradd命令新建名为mylist的新账户。
(2)输入命令行:[root@localhost root]#cat/etc/shadow利用cat查看系统中的账户列表。
用su命令切换到新建的账户,重复步骤(2),检查shadow文件的权限设置是否安全。
设置安全时,普通用户mylist应该没有查看该系统文件的权限。
在终端中出现如下的提示:Cat:/etc/shadow:权限不够2、添加和更改密码(1)在终端输入[root@localhost root]#passwd mylist为新建账户添加密码。
注意:系统管理员无需输入原来密码即可以利用passwd命令添加或改变任意用户的密码,但普通用户只能改变自己的密码。
(2)输入后依次出现如下提示:Changjing passwd for user mylist.New passwd:Retype new passwd:Passwd:all authentication tokens updated susscessfully.输入密码,Linux系统不会将输入显示出来。
操作系统文件管理实验
操作系统实验三:文件管理一.实验目的1.加深对文件,目录,文件系统等概念的理解。
2.掌握UNIX文件系统的目录结构。
3.掌握有关UNIX文件系统操作的常用命令。
4.了解有关文件安全方面的知识。
二.实验内容1.使用pwd,cd,ls等命令浏览文件系统。
2.使用cat,cp,mv,head,tail,rm等命令查看你的文件。
3.使用ln命令进行文件的硬连接和符号连接。
4.使用find,grep命令进行文件查找和模式匹配。
5.使用chmod命令修改文件的权限。
三.实验步骤启动LINUX系统,首先以超级用户ROOT身份登录注册后(占用第一用户平台),然后以普通用户Mengqc(或其他用户名)身份登录注册后,在第二用户平台(<alt>+F2)练习文件管理有关命令.一般在[mengqc @ localhost mengqc]$提示符下键入有关命令。
1.浏览文件系统〈1〉运行pwd命令,确定你当前的工作目录(为/ home/mengqc)。
〈2〉利用以下命令显示当前工作目录的内容:(理解各字段意义。
)ls –l〈3〉运行以下命令:(反馈信息中.代表本身目录,..代表其父目录;选项a可以显示隐藏文件;选项i可以显示文件的I节点号)ls –ai〈4〉使用mkdir命令建立一个子目录subdir,并用ls查看当前目录。
下附本实验文件目录结构。
Mkdir subdir/根目录Ls –lBin dev home rootMengqc mlwjsubdirfa(file1)〈5〉使用带-d选项的ls命令,你只能看到有关子目录的信息(.表示本身目录)。
Ls -d〈6〉使用cd命令,将工作目录改到根目录(/)上。
①用相对路径将工作目录改到根目录。
Pwd 显示当前目录为 /home/mengqcCd .. 相对路径,返回上一级。
Pwd 反馈显示当前目录为 /homeCd .. 相对路径,再返回上一级。
Pwd 反馈显示当前目录为 /Cd /home/mengqc 恢复本身目录(也可以cd↙ ).Pwd 反馈显示当前目录为 /home/mengqc②用绝对路径将工作目录改到根目录。
文件系统模拟实验(C-实验教材)
文件系统实验1.1实验目的和要求1.1.1实验目的通常把文件与管理信息资源的管理程序的集合称为文件系统,它是操作系统中负责存取和管理信息资源的模块,采用统一的方法管理用户信息和系统信息的存储、检索、更新、共享和保护,并为用户提供一套行之有效的文件使用及操作方法。
本实验利用高级语言编写程序模拟文件系统,了解文件系统的基本结构和文件的各种操作方法,加深理解文件系统的内部功能及内部实现,从而帮助学生对各种文件操作命令的实质内容和执行过程有比较深入的了解。
1.1.2实验要求1.采用高级语言编写程序模拟文件系统,文件系统采用多级目录结构,实现对文件和目录的创建、删除、重命名、变更权限、显示文件内容、修改文件内容等操作。
2.撰写实验报告,报告应包含以下内容:(1)实验目的;(2)实验内容;(3)设计思路;(4)程序流程图;(5)程序中主要数据结构和函数说明;(6)带注释的源程序代码;(7)程序运行结果及分析(8)实验收获与体会1.2预备知识1.2.1文件和文件系统1.文件概念现代计算机系统中都配置了外存,大量的程序和数据以文件的形式存放在外存。
如果由用户直接管理文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且多用户环境下还必须能保持数据的安全性和一致性,这是用户不能胜任的。
因而,现代操作系统中都配备文件系统,以适应系统资源管理和用户使用信息的需要。
文件是指由创建者所定义的、具有文件名的一组相关元素的集合。
用户通过文件名就可对文件进行访问,文件名是由字母或数字组成的字母或数字串,其格式和长度都因系统而异。
操作系统提供文件系统的优点有:(1)便于用户使用。
(2)文件安全可靠。
(3)系统能有效利用存储空间,优化安排不同属主文件的位置。
(4)文件系统还能提供文件共享功能。
2.文件命名在不同的操作系统中对文件名的规定有所不同,文件名的格式和长度因系统而异。
一般来说,文件名由文件名和扩展名两部分组成,前者用于标识文件,后者用于区分文件类型,中间用“.”分割开来,它们都是字母或数字所组成的字母数字串。
文件系统 实验
实验快速文件系统一.实验目的通过对3种文件读写模式的模拟,了解快速文件系统是怎样操作的;并掌握文件读写对应的API。
二.实验要求设计三个函数int filter(char source,char*denst),其中source:源文件,即从哪个文件读。
sink:目标文件,即写到哪个文件。
分别用三种方法来实现一个对文件的操作:1)无缓冲方式:表示用的标志位是FILE_FLAG_NO_BUFFERING。
2)缓冲方式:表示用的标志位是FILE_FLAG_SEQUENTIAL_SCAN。
3)异步方式:表示用的标志位是FILE_FLAG_OVERLAPPED。
filter函数的作用是从源文件中读数据,将数据写入denst文件中去。
通过记录各种操作模式的读写时间,分析其结果。
三.背景知识正如我们所知道的:CPU运算速度最快,外部设备最慢。
如果CPU的每次操作都必须等待外设完成,那么CPU宝贵的运行时间就会大大浪费。
下面就介绍两种Windows 2000中解决这个不匹配问题的方法:高速缓存和异步传输。
1.文件高速缓存文件高速缓存是CPU访问外设的一个“中间设备”。
说是设备,其实它不是真正的物理“设备”,而是一种核心级内存映像机制。
由于它被设置在内存中,因此速度非常快,可以部分解决CPU与硬盘速度差异的问题。
文件高速缓存的原理:进程顺序读取:读了文件的第一个字节,读第二个、一直到读出所有的字节。
利用这个原理可以进行“预取”,也就是说,在进程没请求读磁盘之前就先把文件读出来并放到高速缓存中。
在第一次读入后,将文件数据保存在高速缓存中。
这样,下次再读时就不必再从硬盘而可以从缓存中读取。
LRU(LeastRecently Used,最近最少使用)的原则,可以将不常使用的文件从缓存中删除以节省高速缓存空间。
文件高速缓存“事后写”机制:进程写磁盘——写的内容交给高速缓存——寻找CPU空闲的时间写到磁盘上要写磁盘的进程就可以不必等待磁盘写完毕以后再继续工作,这也就节省了整个进程的执行时间。
操作系统实验报告三
操作系统实验报告三一、实验目的本次操作系统实验的目的在于深入了解操作系统的进程管理、内存管理和文件系统等核心功能,通过实际操作和观察,增强对操作系统原理的理解和掌握,提高解决实际问题的能力。
二、实验环境本次实验在 Windows 10 操作系统环境下进行,使用了 Visual Studio 2019 作为编程工具,并借助了相关的操作系统模拟软件和调试工具。
三、实验内容与步骤(一)进程管理实验1、创建多个进程使用 C++语言编写程序,通过调用系统函数创建多个进程。
观察每个进程的运行状态和资源占用情况。
2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。
分析在不同并发情况下程序的执行结果,理解进程同步的重要性。
(二)内存管理实验1、内存分配与回收实现一个简单的内存分配算法,如首次适应算法、最佳适应算法或最坏适应算法。
模拟内存的分配和回收过程,观察内存的使用情况和碎片产生的情况。
2、虚拟内存管理了解 Windows 操作系统的虚拟内存机制,通过查看系统性能监视器观察虚拟内存的使用情况。
编写程序来模拟虚拟内存的页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。
(三)文件系统实验1、文件操作使用 C++语言对文件进行创建、读写、删除等操作。
观察文件在磁盘上的存储方式和文件目录的结构。
2、文件系统性能测试对不同大小和类型的文件进行读写操作,测量文件系统的读写性能。
分析影响文件系统性能的因素,如磁盘碎片、缓存机制等。
四、实验结果与分析(一)进程管理实验结果1、创建多个进程在创建多个进程的实验中,通过任务管理器可以观察到每个进程都有独立的进程 ID、CPU 使用率、内存占用等信息。
多个进程可以并发执行,提高了系统的资源利用率。
2、进程同步与互斥在生产者消费者问题的实验中,当使用正确的信号量机制时,生产者和消费者能够协调工作,不会出现数据不一致或死锁的情况。
操作系统实验三--文件操作
一、试验目的理解操作系统文件系统设计的原理二、试验要求1、模拟实现一个1M大小的文件系统,其中512B为一个扇区2、要求实现打开文件,关闭文件,创建文件,创建目录,删除文件,删除目录,显示目录下的文件等操作。
3、实验平台不限,linux和windows均可。
三、试验环境Windows XP ,vc++6.0四、试验内容本次实验内容是文件系统,因为windows多用图形用户界面操作,对其具体的文件系统不了解,所以本次实验模仿了linux下的文件指令。
首先强调一点,linux的所有文件和目录都在根目录——"/"下程序实现的顶层操作列表如下:1 目录指令指令作用mkdir name 创建名为name的目录,可以包含路径cd name 进入名为name的目录,可以包含路径如果name = ".."为返回上一级目录ls 列出当前目录下的所有文件和目录ll 列出当前目录下的所有文件和目录,并显示具体信息pwd 显示当前目录的路径rm name 删除当前目录下的目录及其子目录和目录下的所有文件,不支持绝对路径2 文件指令指令作用touch name 在当前目录下建立名为name的文件,支持列出绝对路径cat name 显示目录下名为name的文件内容,支持绝对路径vi name 编辑名为name的文件,这里是模仿linux下vi编辑器,但是本程序只能编辑已经存在的文件编辑后,输入"q"退出(相当于关闭文件)d name 删除当前目录下名为name的文件,不支持绝对路径3 系统指令指令作用tree folder_name 列出指定目录的树形图exit 退出文件系统date 显示当前时间日期h 显示帮助文档df 查看磁盘剩余空间对于底层的功能,程序中表示磁盘的数据结构为一数组名为inf的数组为一个信息表,其中包含了该空间是否可用以及下个单元的位置这里要说明一下,此模拟的磁盘是仿照链式存储做的,每一块都记录下一条内容的位置的信息结构如图:代码太长,还是看一个运行的例子吧构建一个如下所示的文件系统要输入的指令如下:mkdir amkdir btouch acd atouch bmkdir ccd ..cd bmkdir dcd dmkdir emkdir ftouch ccd /tree /运行结果:接下来是编辑三个文件a、b、c的内容在这里我们可以先查看一下文件夹和文件的大小: 用ll指令我们可用看到目前所有的文件和文件夹大小都为0接下来我们给图中的三个文件输入内容从上图看到,当再次输入"ll"指令时,文件和文件夹大小均改变,且文件的改动时间也更新了接下来我们试一下删除文件夹的指令,首先看一下当前磁盘的剩余空间“df”指令然后执行删除后再看磁盘剩余空间我们发现,磁盘恢复了原来b占用的6kb大小,切树形图显示b已经被删除接下来我们删除a文件试一下运行结果正如预料到的现在我们尝试一下pwd指令和cat指令吧至此,实验要求的文件及目录的操作均演示完成至于具体的代码解释,代码太长了,解释起来实在不方便,望老师谅解五、心得体会本次实验有很多遗憾1、实验开始的时候,本来想把父母节点叶节点分为两种数据结构,以便节约内存空间和效率,但最后因为删除、显示列表等操作过于复杂,所以就没有采用这种方法2、很多指令没有支持绝对路径进入,且vi指令不能在没有同名文件的情况下创建一个文件。
实验三 用户和组的管理及文件系统管理(一)
实验三用户和组的管理及文件系统管理(一)实验目的:一、掌握Windows 2003 中用户和组的添加、删除等方法。
二、了解用户配置文件的类型以及创建方法。
三、掌握将用户添加入组的方法。
四、掌握NTFS格式下的磁盘安全管理的基本方法。
五、掌握文件访问权限的管理方法。
六、掌握在NTFS格式下文件移动与复制后权限变化的规律。
实验设备:PC机及Windows 2003系统(文件系统要求为NTFS格式)实验内容:一、新建用户1.打开系统盘(即当前系统所在的分区)根目录下的Documents and Settings 文件夹,观察文件夹的数量,打开Administrator文件夹,观察该文件夹的内容。
2.首先观察计算机管理中系统默认的用户数量及相应的描述。
在Windows 2003中建立一新本地用户student01,要求用户在下次登陆时必须修改密码。
3.注销当前的Administrators用户,重新以student01用户身份登陆,观察登陆时与原登陆方式以及登陆后桌面图标的变化。
进入系统后,尝试对系统属性等进行修改,观察是否都能够进行;查看时候能够重新启动计算机或者关闭计算机。
4.注销student01用户,重新以Administrator用户身份登陆计算机,进入系统后,新建一本地用户student02,要求用户以后登陆时不需要进行密码修改,再重新以student02的用户身份登陆计算机,观察是否能够修改自己的登陆密码。
然后打开系统盘(即当前系统所在的分区)根目录下的Documents and Settings 文件夹,观察文件夹的数量,比较与第1步观察的结果有哪些区别。
5.重新以Administrator用户身份登陆,进入系统后,修改student01用户的密码;将student02用户删除。
6.新建4个用户:user1、user2、user3和user4。
二、本地组的创建与管理1.在“计算机管理”中,观察系统默认的组的数量、属性描述等内容。
徐家乐1521030实验三Linux文件系统及文件管理
徐家乐1521030实验三Linux⽂件系统及⽂件管理实验三1 实验名称:Linux⽂件系统及⽂件管理2 实验⽬的通过本实验了解Linux操作系统⽀持的多⽂件系统,并熟练掌握Linux⽂件管理⽅法,使实验者具备初步的Linux操作系统⽂件管理能⼒,包括:2.1 掌握磁盘管理能⼒2.2 掌握⽬录与⽂件管理能⼒2.3 掌握⽂件归档与压缩能⼒2.4 掌握RPM软件包管理能⼒3 实验环境3.1Windows XP下基于“VMware Workstation”虚拟机环境的Red Hat Enterprise Linux Server 5系统。
3.2将主机改为具有个⼈学号后3位特征的名称。
4实验要求、步骤及结果4.1掌握与磁盘管理相关的shell命令的使⽤。
【操作要求1】查看系统已挂载⽂件系统信息;截取/dev下某⼀挂载设备(/dev/sda2)的具体信息,解释其含义。
查看该挂载点(/)的详细信息;访问该挂载点(/);查看该挂载点(/)上⽂件的详细信息;返回个⼈⽤户主⽬录。
【操作步骤1-查看挂载信息】【截取挂载相关信息及注解】【操作步骤2-查看挂载点】【操作步骤3-访问】【操作步骤4-查看⽂件】【操作要求3】分页查看/etc⽬录中⽂件信息;将/etc⽬录中fstab⽂件复制到当前⽬录下;显⽰fstab 的内容;显⽰fstab的访问权限;增加同组⽤户对fstab⽂件写的权限。
【操作步骤1-查看/ect】【操作步骤2-复制⽂件】【操作步骤3-显⽰⽂件内容】【操作步骤4-显⽰⽂件权限】【截取访问权限-字母表⽰】【转换访问权限-数字表⽰】664【操作步骤5-修改⽂件权限】【截取访问权限-字母表⽰】【转换访问权限-数字表⽰】6644.2掌握⽬录与⽂件管理相关的shell命令的使⽤。
【操作要求1】⽤⼀条命令新建具有如下结构的⽬录树。
注意:⽂件名严格区分⼤⼩写。
【操作要求1】【操作要求2】将M2⽬录重命名为m2;查看m1⽬录的访问权限;减去其它⽤户对m1⽬录的执⾏权。
实验三 文件系统空闲空间管理模拟
实验三文件系统空闲空间管理模拟一、实验内容及要求要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程;二、基本原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。
当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。
三、实验步骤1. 输入已知参数:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q, 计算位示图大小;假设采用整数数组,则数组大小为:Size= (柱面数*每柱面磁道数*每磁道物理块数)/ sizeof(int) +12. 申请大小为size的整数数组map,并对其进行随机初始化。
例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=16, 则位示图大小为4,map[4]如下:位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。
即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。
如上表所示,29号磁盘的状态存在map[1]中,对应于第13位, 第一行表示位号。
3. 根据位示图中为1的位信息,生成一张已分配磁盘块表。
如:map[0]的第1位为1,则i=0,j=1, 其对应的相对块号block为1, 柱面号为0,磁道号为,物理块号为1计算公式如下:(1)已知位示图中的下标i , j, 计算相对块号Block= i*sizeof( int )+j(2)已知相对块号计算柱面、磁道、物理块号如下:柱面号C= 相对块号/(每柱面磁道数*每磁道物理块数)磁道号H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数物理块号R= 相对块号%每磁道物理块数4. 提出申请磁盘块或释放磁盘块的要求,根据要求完成操作。
计算机原理-文件系统实验
计算机原理-文件系统实验一 .目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个 n个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 .例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)文件系统算法的流程图如下:三 .实验题:增加 2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define getpch(type) (type*)malloc(sizeof(type)) int userNum=0;struct mdf{char userName[20];struct UFD* p;} mdf[20];struct ufd{char fileName[20];char File[50];struct ufd * next;}*fp,*tp,*p,*begin;typedef struct ufd UFD ;void show(struct UFD *f){begin=f;if(begin->next==NULL) printf("该用户名下尚无文件!\n");else{printf("该用户名下所有文件:\n");begin=begin->next;while(begin!=NULL){printf("%s: %s\n",begin->fileName,begin->File); begin=begin->next;}}}void Operation(struct UFD *f){int i;char filename[20],file[50];begin=f;label:printf("请选择操作:\n 1:create; 2:delete; 3:read; 4:write; 5:open;\n 6:lose; 7:Chang File's Name;8:Show All The File\n");scanf("%d",&i);if(i==1){tp=getpch(UFD);printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n文件创建完毕!\n");goto label;}else if(i==2){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{tp=begin;while(tp->next!=p) tp=tp->next;tp->next=p->next;free(p);printf("文件已删除!\n");}goto label;}else if(i==3){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{printf("%s: %s\n",p->fileName,p->File);}goto label;}else if(i==4){printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);p=begin->next;while(p!=NULL){if(!(strcmp(p->fileName,filename))){strcpy(p->File,file);printf("\n替换了以%s为名的文件!\n",filename); goto label;}p=p->next;}tp=getpch(UFD);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n创建了以%s为名的文件!\n",filename); goto label;}else if(i==5){goto label;else if(i==6){printf("功能被关闭,无法操作了\n"); Select();}else if(i==7){printf("请输入要改名的文件名:"); scanf("%s",filename);while(p!=NULL){if(!(strcmp(p->fileName,filename))) {printf("\n请输入新的文件名:");scanf("%s",filename);strcpy(p->fileName,filename);printf("\n文件名已更改!\n");goto label;}p=p->next;}printf("文件不存在!\n");goto label;}else if(i==8){show(f);goto label;else{goto label;}}void Select(){char username[20];int i;printf("请输入用户名:\n");scanf("%s",username);for(i=0; i<userNum; i++){if(!strcmp(mdf[i].userName,username)) {fp= mdf[i].p;if(fp!=NULL){printf("该用户已创建文件:\n");while(fp!=NULL){fp=fp->next;printf("%s\n",fp->fileName);}}else{printf("该用户尚未创建任何文件!\n");fp= mdf[i].p;Operation(fp);}}if(i>=userNum){printf("该用户不存在,创建新用户?\n1:是 2:否\n");scanf("%d",&i);if(i==1){strcpy(mdf[userNum++].userName,username); printf("已创建用户!\n");i=userNum-1;fp= mdf[i].p;Operation(fp);}else{printf("查询其它?\n 1:是 2:否\n");scanf("%d",&i);if(i==1){Select();}else{printf("谢谢使用!\n");return;}}}}int main(){int i;for(i=0; i<20; i++){tp=getpch(UFD);tp->next=NULL;mdf[i].p=tp;}Select();return 0;}编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
操作系统实验---文件系统
实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。
2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。
3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二、实验设备及软件:一台PC(Linux系统)三、实验方法(原理、流程图)试验方法(1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建文件,可以编号存储于磁盘上。
如file0,file1,file2…并以编号作为物理地址,在目录中登记。
文件系统功能流程图图1.文件系统总体命令分析图 2.登录流程图图 3. ialloc流程图图4.balloc流程图图5.密码修改流程图图6.初始化磁盘图 7.显示所有子目录 dir/ls 操作流程图图8.创建文件 creatfile 、创建目录 mkdir 流程图图9.改变当前路径 cd 操作流程图实验原理1.文件操作◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。
在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。
具体流程图查看第二节,系统流程图设计部分。
◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。
在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。
操作系统试验三__文件管理
《计算机操作系统》课程实验报告题目文件管理学院: 计算机学院专业: 计算机科学与技术名姓级班学号日22月12 年2016.实验三文件管理1.实验目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。
要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。
2.实验内容:最基本的文件操作(1)创建文件在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。
目录项中应该记录新文件的文件名及其在外存的地址等属性。
(2)删除文件当已不再需要某文件时,可将它从文件系统中删除。
在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
(3)读文件在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。
此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。
在目录项中,还有一个指针用于对文件的读/写。
(4)写文件在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。
为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。
(5)截断文件如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。
但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。
写位置/)设置文件的读6(.前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。
设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。
也正因如此,才能改顺序存取为随机存取。
3.设计实现:1)流程图2)详细设计源代码#include <stdio.h>#include <string.h>#include <conio.h>#include <stdlib.h>#include <time.h>个用户100定义最多有#define MaxUser 100 //#define MaxDisk 512*1024 //定义磁盘空间大小#define commandAmount //对文件操作的指令数//存储空间管理有关结构体和变量char disk[MaxDisk];// 模拟512K的磁盘存储空间typedef struct distTable //磁盘块结构体{int maxlength;int start;int useFlag;distTable *next;}diskNode;diskNode *diskHead;typedef struct fileTable //文件快结构体{char fileName[10];int start; //文件在磁盘存储空间的起始地址int length; //文件内容长度int maxlength;//文件的最大长度char fileKind[3];//文件的属性--读写方式struct tm *timeinfo;bool openFlag;//判断是否有进程打开了文件};int used = 0;// 定义 MFD 目录中用已有的用户数//两级目录结构体typedef struct user_file_directory //用户文件目录文件 UFD {fileTable *file;user_file_directory *next;}UFD;typedef struct master_file_directory //主目录文件{char userName[10];char password[10];UFD *user;}MFD;MFD userTable[MaxUser];int userID = -1; //用户登录的 ID 号,值为-1 时表示没有用户登录//文件管理void fileCreate(); //创建文件void fileDelet(); //删除文件void fileWrite(); //写文件void fileRead();//读文件void fileRename(); //重命名文件void fileFind(); //查询文件void fileDir();// 显示某一用户所有文件void fileClose(); //关闭已打开的文件void fileChange();//修改文件的读写方式int requestDist(int &stratPostion, int maxlength);//磁盘分配查询void initDisk();//初始化磁盘void freeDisk(int startPostion);//磁盘空间释放void diskShow();//显示磁盘使用情况void initFile();//用户管理void userCreate();int login();void userDelet();void userFind();//用户登陆主界面void webUser();//用户内部界面void webFile();int main(){initDisk();initFile();webUser();return 0;}void webUser(){int i;while (1){printf(************************************************************\n);printf(.创建用户 2.登陆用户\n);查看用户 4.删除用户printf( . \n);printf(退出系统\n);printf(************************************************************\n);牰湩晴尨请输入操作号\n);scanf(%d, &i);switch (i){case 0:exit(0); break;case 1:userCreate(); break;case 2:userID = login();if (userID != -1){webFile();}break;case 3:userDelet(); break;case 4:userFind(); break;default:牰湩晴尨您输入的命令有误,请重新选择\n);system(pause);system(cls);break;}}}void userCreate(){char c;char userName[10];int i;if (used<MaxUser){牰湩晴尨请输入用户名:);for (i = 0; c = _getch(); i++){if (c == 13) break;elseuserName[i] = c;printf(%c, c);}userName[i] = '\0';for (i = 0; i<used; i++){if (!strcmp(userTable[i].userName, userName)){printf(\);\n); 牰湩晴尨该用户名已存在创建用户失败,system(pause); system(cls);return;}}strcpy(userTable[used].userName, userName);printf(\);); 请输入密码:牰湩晴尨for (i = 0; c = _getch(); i++){if (c == 13) break;elseuserTable[used].password[i] = c;printf(*);}userTable[userID].password[i] = '\0';printf(\);牰湩晴尨创建用户成功\n);used++;system(pause);system(cls);}else{牰湩晴尨创建用户失败,用户已达到上限\n);system(pause);system(cls);}fflush(stdin);}int login(){char name[10], psw[10];char c;int i, times;:); 请输入用户名牰湩晴尨for (i = 0; c = _getch(); i++) {if (c == 13) break;elsename[i] = c;printf(%c, c);}name[i] = '\0';for (i = 0; i < used; i++){if (!strcmp(userTable[i].userName, name))break;}if (i == used){\n); 您输入的用户名不存在printf(\system(pause);system(cls);return -1;}for (times = 0; times<3; times++){memset(psw, '\0', sizeof(psw));:); printf(\请输入密码for (i = 0; c = _getch(); i++){if (c == 13) break;elsepsw[i] = c;printf(*);}printf(\);for (i = 0; i<used; i++){if (!strcmp(psw, userTable[i].password)){牰湩晴尨用户登录成功\n);system(pause);system(cls);break;}}if (i == used){牰湩晴尨您输入的密码错误,您还有 %d 次输入机会\n, 2 - times); if (times == 2) exit(0);}else break;fflush(stdin);return i;}void userDelet(){int statePos;UFD *q;char name[10], psw[10];char c;int i, times, j;牰湩晴尨请输入用户名:);for (i = 0; c = _getch(); i++){if (c == 13) break;elsename[i] = c;printf(%c, c);}name[i] = '\0';for (i = 0; i < used; i++){if (!strcmp(userTable[i].userName, name)) break;}if (i == used){\n); printf(\您输入的用户名不存在system(pause); system(cls);}else{q = userTable[i].user->next;while (q){if (q->file != NULL){statePos = q->file->start;}freeDisk(statePos);q = q->next;}for (i, j = i+1; i <= used; j++, i++){userTable[i] = userTable[j];}\n); 用户删除成功printf(\system(pause);system(cls);used--;}}void userFind(){int i;牰湩晴尨用户列表:\n);for (i = 0; i < used; i++){printf(%s\n, userTable[i].userName);}system(pause);system(cls);}void webFile(){int i;char name[10], kind[3];printf(********************************************************\n); printf( 1.创建 2.删除 \n); printf( 3.写入文件 4.查看文件内容 \n); printf( 5.重命名 6.查看文件属性 \n); printf( 7.查看用户文件 8.关闭文件 \n); printf( 9.修改文件权限 10.查看磁盘使用情况 \n); printf( 11.返回上级目录 12.退出系统 \n); printf(*********************************************************\n); 牰湩晴尨请输入操作号:);scanf(%d, &i);while (1){switch (i){case 1:fileCreate();break;case 2:fileDelet();break;case 3:fileWrite();break;case 4:fileRead();break;case 5:fileRename();break;case 6:fileFind();break;case 7:fileDir();break;case 8:fileClose();break;case 9:fileChange();break;case 10:diskShow();break;case 11:system(cls);webUser();break;case 12:exit(0);break;default:牰湩晴尨输入错误请重新输入:);break;}scanf(%d, &i);}}void fileCreate(){time_t rawtime;int startPos;char c;char fileName[10], fileKind[10], fileLength[10];char command[50];int length;//int i, k,j;printf( 创建文件格式为名称长度权限(r、w、rw):); fflush(stdin);gets(command);int i, k, j;for (i = 0, k = 0; command[i] != ' '; i++, k++)fileName[k] = command[i];fileName[k] = '\0';k = i;for (i = k + 1, k = 0; command[i] != ' '; i++, k++)fileLength[k] = command[i];fileLength[k] = '\0';k = i;j = 1;length = 0;//初始化文件长度for (i = strlen(fileLength) - 1; i >= 0; i--)//把字符串转换为十进制{length += (fileLength[i] - 48)*j;j *= 10;}for (i = k + 1, k = 0; command[i] != ' '&&command[i] != '\0'; i++, k++) fileKind[k] = command[i];fileKind[k] = '\0';UFD *fileNode, *p;for (p = userTable[userID].user->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName)){牰湩晴尨文件重名,创建文件失败 \n);system(pause);return;}}if (requestDist(startPos, length)){fileNode = (UFD*)malloc(sizeof(UFD));fileNode->file = (fileTable*)malloc(sizeof(fileTable));strcpy(fileNode->file->fileName, fileName);strcpy(fileNode->file->fileKind, fileKind);fileNode->file->maxlength = length;fileNode->file->start = startPos;fileNode->file->openFlag = false;time(&rawtime);fileNode->file->timeinfo = localtime(&rawtime);fileNode->next = NULL;if (userTable[userID].user->next == NULL)userTable[userID].user->next = fileNode;else{p = userTable[userID].user->next;while (p->next) p = p->next;p->next = fileNode;}牰湩晴尨创建文件成功\n);system(pause);}else{牰湩晴尨磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n); system(pause);}}void initDisk(){diskHead = (diskNode *)malloc(sizeof(diskNode));diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start = 0;diskHead->next = NULL;}void initFile(){int i;for (i = 0; i<MaxUser; i++)//初始化用户 UFD 目录文件的头指针{userTable[i].user = (UFD *)malloc(sizeof(UFD)); userTable[i].user->next = NULL;}}int requestDist(int &startPostion, int maxLength) {int flag = 0; //标记是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p){if (p->useFlag == 0 && p->maxlength>maxLength) {startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode));q->start = p->start;q->maxlength = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength; diskHead->maxlength = p->maxlength - maxLength; flag = 1;temp = p;if (diskHead->next == NULL) diskHead->next = q; else{while (temp->next) temp = temp->next;temp->next = q;}break;}p = p->next;}return flag;}void freeDisk(int startPostion){diskNode *p;for (p = diskHead; p != NULL; p = p->next){if (p->start == startPostion)break;}p->useFlag = false;}void fileDelet(){char fileName[10], command[50];int i, k;fflush(stdin);); printf( 输入文件名称:gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q, *temp;q = userTable[userID].user;p = q->next;while (p){if (!strcmp(p->file->fileName, fileName)) break;else{p = p->next;q = q->next;}}if (p){if (p->file->openFlag != true)//先判断是否有进程打开该文件temp = p;q->next = p->next;freeDisk(temp->file->start); // 磁盘空间回收free(temp);牰湩晴尨文件删除成功\n);system(pause);}else{\n); 牰湩晴尨, 该文件正在被占用删除失败system(pause);}}else{\n); 没有找到该文件牰湩晴尨,请检查输入的文件名是否正确system(pause);}}void fileRead(){int startPos, length;int k, i;char fileName[10], command[50];printf( 输入文件名称:);fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';k = 0;UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){startPos = p->file->start;length = p->file->length;文件打开标记p->file->openFlag = true;//printf(*****************************************************\n);for (int i = startPos; k<length; i++, k++){if (i % 50 == 0) printf(\); //一行大于 50 个字符换行printf(%c, disk[i]);}printf(\\n*****************************************************\n);printf(%s 文件正在被占用 , 请先将其关闭\n, p->file->fileName); system(pause);}else{牰湩晴尨没有找到该文件,请检查输入的文件名是否正确\n);system(pause);}}void fileWrite(){char fileName[10], command[50];int i, k, startPos;); 输入文件名称: printf(fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){if (!strcmp(p->file->fileKind,))//判断文件类型{牰湩晴尨该文件是只读文件 ,写入失败\n);system(pause);return;}char str[500];printf(please input content:\n);gets(str);startPos = p->file->start;p->file->openFlag = true;//文件打开标记p->file->length = strlen(str);if (p->file->length>p->file->maxlength){\n); 写入失败写入字符串长度大于该文件的总长度牰湩晴尨 ,system(pause);return;}for (i = startPos, k = 0; k<(int)strlen(str); i++, k++)disk[i] = str[k];牰湩晴尨文件写入成功, 请将该文件关闭\n);system(pause);}else{牰湩晴尨没有找到该文件,请检查输入的文件名是否正确\n);system(pause);}}void fileFind(){char fileName[10], command[50];int i, k;printf( 输入文件名称:);fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){printf(********************************************\n);%s\n, p->file->fileName); 文件名:牰湩晴尨%d\n, p->file->maxlength);牰湩晴尨文件长度:%d\n, p->file->start); 牰湩晴尨文件在存储空间的起始地址:%s\n, p->file->fileKind);文件类型:牰湩晴尨%s\n, asctime(p->file->timeinfo)); 牰湩晴尨创建时间:printf(********************************************\n);system(pause);}else{\n); 请检查输入的文件名是否正确,没有找到该文件牰湩晴尨system(pause);}}void fileChange(){char fileName[10], fileKind[10], command[50];int i, k;fflush(stdin);printf( 输入文件名称和新的文件权限:);gets(command);for (i = 0, k = 0; command[i] != ' '; i++, k++)fileName[k] = command[i];fileName[k] = '\0';for (k = i + 1, i = 0; command[k] != '\0'; i++, k++) fileKind[i] = command[k];fileKind[i] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){strcpy(p->file->fileKind, fileKind);\n); 牰湩晴尨修改文件类型成功system(pause);}else{牰湩晴尨没有找到该文件,请检查输入的文件名是否正确\n); system(pause);}}void fileRename(){char fileName[10], fileRename[10], command[50];int i, k;fflush(stdin);); printf( 输入文件名称和新的文件名称:gets(command);for (i = 0, k = 0; command[i] != ' '; i++, k++) fileName[k] = command[i];fileName[k] = '\0';for (k = i + 1, i = 0; command[k] != '\0'; i++, k++) fileRename[i] = command[k];fileRename[i] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){while (q->next){if (!strcmp(q->next->file->fileName, fileRename)){牰湩晴尨您输入的文件名已存在, 重命名失败\n);system(pause);return;}q = q->next;}strcpy(p->file->fileName, fileRename);牰湩晴尨重命名成功\n);system(pause);}else{牰湩晴尨没有找到该文件,请检查输入的文件名是否正确\n); system(pause);}}void fileDir(){char userName[10], command[50];int i, k;); printf( 输入用户名称:fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)userName[k] = command[i];userName[k] = '\0';UFD *p;for (i = 0; i<MaxUser; i++){if (!strcmp(userTable[i].userName, userName)){k = i;break;}}if (i == MaxUser){\n); 没有找到该用户,请检查输入用户名是否正确牰湩晴尨system(pause); return;}else{p = userTable[k].user->next;printf(******************************************************************* ************\n);牰湩晴尨文件名文件长度文件在磁盘的起始地址文件类型创建时间\n);for (; p != NULL; p = p->next)printf(%s %d %d %s %s,p->file->fileName, p->file->maxlength,p->file->start, p->file->fileKind, asctime(p->file->timeinfo));printf(********************************************************************************\n);system(pause);}}void diskShow(){diskNode *p;int i = 0, unusedDisk = 0;printf(**************************************************************************\n );printf( 盘块号起始地址容量(bit) 是否已被使用\n);for (p = diskHead; p != NULL; p = p->next, i++){if (p->useFlag == false) unusedDisk += p->maxlength;printf( %d %d %d %d\n, i, p->start, p->maxlength,p->useFlag);}printf(***************************************************************************\ n);printf( 磁盘空间总容量: 512*1024bit 已使用: ?it末使用:?it\n, MaxDisk - unusedDisk, unusedDisk);system(pause);}void fileClose(){char fileName[10], command[50];int i, k;printf( 输入文件名称:);fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){p->file->openFlag = false;\n, p->file->fileName); 文件已关闭 printf(%ssystem(pause);}else{\n); ,牰湩晴尨没有找到该文件请检查输入的文件名是否正确system(pause);}}4.实验结果1、创建用户2、登录用户3、查看用户4、删除用户、创建文件5.6、删除文件7、写入文件、查看文件内容8.9、重命名10、查看文件属性11、查看用户文件12、关闭文件13、修改文件权限14、查看磁盘使用情况15、返回上级目录5.实验过程中出现的问题及解决办法。
操作系统实验三__文件管理
《计算机操作系统》课程实验报告题目文件管理学院: 计算机学院专业: 计算机科学与技术姓名班级学号2016年12月22日实验三文件管理1.实验目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。
要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。
2.实验内容:最基本的文件操作(1)创建文件在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。
目录项中应该记录新文件的文件名及其在外存的地址等属性。
(2)删除文件当已不再需要某文件时,可将它从文件系统中删除。
在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
(3)读文件在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。
此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。
在目录项中,还有一个指针用于对文件的读/写。
(4)写文件在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。
为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。
(5)截断文件如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。
但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。
(6)设置文件的读/写位置前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。
设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。
也正因如此,才能改顺序存取为随机存取。
3.设计实现:1)流程图2)详细设计源代码#include <stdio.h>#include <string.h>#include <conio.h>#include <stdlib.h>#include <time.h>#define MaxUser 100 //定义最多有100个用户#define MaxDisk 512*1024 //定义磁盘空间大小#define commandAmount //对文件操作的指令数//存储空间管理有关结构体和变量char disk[MaxDisk];// 模拟512K的磁盘存储空间typedef struct distTable //磁盘块结构体{int maxlength;int start;int useFlag;distTable *next;}diskNode;diskNode *diskHead;typedef struct fileTable //文件快结构体{char fileName[10];int start; //文件在磁盘存储空间的起始地址int length; //文件内容长度int maxlength;//文件的最大长度char fileKind[3];//文件的属性--读写方式struct tm *timeinfo;bool openFlag;//判断是否有进程打开了文件};int used = 0;// 定义 MFD 目录中用已有的用户数//两级目录结构体typedef struct user_file_directory //用户文件目录文件 UFD {fileTable *file;user_file_directory *next;}UFD;typedef struct master_file_directory //主目录文件{char userName[10];char password[10];UFD *user;}MFD;MFD userTable[MaxUser];int userID = -1; //用户登录的 ID 号,值为-1 时表示没有用户登录//文件管理void fileCreate(); //创建文件void fileDelet(); //删除文件void fileWrite(); //写文件void fileRead();//读文件void fileRename(); //重命名文件void fileFind(); //查询文件void fileDir();// 显示某一用户所有文件void fileClose(); //关闭已打开的文件void fileChange();//修改文件的读写方式int requestDist(int &stratPostion, int maxlength);//磁盘分配查询void initDisk();//初始化磁盘void freeDisk(int startPostion);//磁盘空间释放void diskShow();//显示磁盘使用情况void initFile();//用户管理void userCreate();int login();void userDelet();void userFind();//用户登陆主界面void webUser();//用户内部界面void webFile();int main(){initDisk();initFile();webUser();return 0;}void webUser(){int i;while (1){printf("************************************************************\n");printf("1.创建用户 2.登陆用户\n");printf("3.删除用户 4.查看用户\n");printf("0.退出系统\n");printf("************************************************************\n");printf("请输入操作号\n");scanf("%d", &i);switch (i){case 0:exit(0); break;case 1:userCreate(); break;case 2:userID = login();if (userID != -1){webFile();}break;case 3:userDelet(); break;case 4:userFind(); break;default:printf("您输入的命令有误,请重新选择\n");system("pause");system("cls");break;}}}void userCreate(){char c;char userName[10];int i;if (used<MaxUser){printf("请输入用户名:");for (i = 0; c = _getch(); i++){if (c == 13) break;elseuserName[i] = c;printf("%c", c);}userName[i] = '\0';for (i = 0; i<used; i++){if (!strcmp(userTable[i].userName, userName)){printf("\n");printf("该用户名已存在,创建用户失败\n");system("pause");system("cls");return;}}strcpy(userTable[used].userName, userName);printf("\n");printf("请输入密码:");for (i = 0; c = _getch(); i++){if (c == 13) break;elseuserTable[used].password[i] = c;printf("*");}userTable[userID].password[i] = '\0';printf("\n");printf("创建用户成功\n");used++;system("pause");system("cls");}else{printf("创建用户失败,用户已达到上限\n");system("pause");system("cls");}fflush(stdin);}int login(){char name[10], psw[10];char c;int i, times;printf("请输入用户名:");for (i = 0; c = _getch(); i++){if (c == 13) break;elsename[i] = c;printf("%c", c);}name[i] = '\0';for (i = 0; i < used; i++){if (!strcmp(userTable[i].userName, name)) break;}if (i == used){printf("\n 您输入的用户名不存在\n");system("pause");system("cls");return -1;}for (times = 0; times<3; times++){memset(psw, '\0', sizeof(psw));printf("\n 请输入密码:");for (i = 0; c = _getch(); i++){if (c == 13) break;elsepsw[i] = c;printf("*");}printf("\n");for (i = 0; i<used; i++){if (!strcmp(psw, userTable[i].password)){printf("用户登录成功\n");system("pause");system("cls");break;}}if (i == used){printf("您输入的密码错误,您还有%d 次输入机会\n", 2 - times);if (times == 2) exit(0);}else break;}fflush(stdin);return i;}void userDelet(){int statePos;UFD *q;char name[10], psw[10];char c;int i, times, j;printf("请输入用户名:");for (i = 0; c = _getch(); i++){if (c == 13) break;elsename[i] = c;printf("%c", c);}name[i] = '\0';for (i = 0; i < used; i++){if (!strcmp(userTable[i].userName, name)) break;}if (i == used){printf("\n 您输入的用户名不存在\n");system("pause");system("cls");}else{q = userTable[i].user->next;while (q){if (q->file != NULL){statePos = q->file->start;}freeDisk(statePos);q = q->next;}for (i, j = i+1; i <= used; j++, i++){userTable[i] = userTable[j];}printf("\n 用户删除成功\n");system("pause");system("cls");used--;}}void userFind(){int i;printf("用户列表:\n");for (i = 0; i < used; i++){printf("%s\n", userTable[i].userName); }system("pause");system("cls");}void webFile(){int i;char name[10], kind[3];printf("********************************************************\n"); printf(" 1.创建 2.删除 \n"); printf(" 3.写入文件 4.查看文件内容 \n"); printf(" 5.重命名 6.查看文件属性 \n"); printf(" 7.查看用户文件 8.关闭文件 \n"); printf(" 9.修改文件权限 10.查看磁盘使用情况 \n"); printf(" 11.返回上级目录 12.退出系统 \n"); printf("*********************************************************\n"); printf("请输入操作号:");scanf("%d", &i);while (1){switch (i){case 1:fileCreate();break;case 2:fileDelet();break;case 3:fileWrite();break;case 4:fileRead();break;case 5:fileRename();break;case 6:fileFind();break;case 7:fileDir();break;case 8:fileClose();break;case 9:fileChange();break;case 10:diskShow();break;case 11:system("cls");webUser();break;case 12:exit(0);break;default:printf("输入错误请重新输入:");break;}scanf("%d", &i);}}void fileCreate(){time_t rawtime;int startPos;char c;char fileName[10], fileKind[10], fileLength[10];char command[50];int length;//int i, k,j;printf(" 创建文件格式为名称长度权限(r、w、rw):");fflush(stdin);gets(command);int i, k, j;for (i = 0, k = 0; command[i] != ' '; i++, k++)fileName[k] = command[i];fileName[k] = '\0';k = i;for (i = k + 1, k = 0; command[i] != ' '; i++, k++)fileLength[k] = command[i];fileLength[k] = '\0';k = i;j = 1;length = 0;//初始化文件长度for (i = strlen(fileLength) - 1; i >= 0; i--)//把字符串转换为十进制{length += (fileLength[i] - 48)*j;j *= 10;}for (i = k + 1, k = 0; command[i] != ' '&&command[i] != '\0'; i++, k++) fileKind[k] = command[i];fileKind[k] = '\0';UFD *fileNode, *p;for (p = userTable[userID].user->next; p != NULL; p = p->next) {if (!strcmp(p->file->fileName, fileName)){printf("文件重名,创建文件失败\n");system("pause");return;}}if (requestDist(startPos, length)){fileNode = (UFD*)malloc(sizeof(UFD));fileNode->file = (fileTable*)malloc(sizeof(fileTable));strcpy(fileNode->file->fileName, fileName);strcpy(fileNode->file->fileKind, fileKind);fileNode->file->maxlength = length;fileNode->file->start = startPos;fileNode->file->openFlag = false;time(&rawtime);fileNode->file->timeinfo = localtime(&rawtime);fileNode->next = NULL;if (userTable[userID].user->next == NULL)userTable[userID].user->next = fileNode;else{p = userTable[userID].user->next;while (p->next) p = p->next;p->next = fileNode;}printf("创建文件成功\n");system("pause");}else{printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");system("pause");}}void initDisk(){diskHead = (diskNode *)malloc(sizeof(diskNode));diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start = 0;diskHead->next = NULL;}void initFile(){int i;for (i = 0; i<MaxUser; i++)//初始化用户 UFD 目录文件的头指针{userTable[i].user = (UFD *)malloc(sizeof(UFD));userTable[i].user->next = NULL;}}int requestDist(int &startPostion, int maxLength){int flag = 0; //标记是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p){if (p->useFlag == 0 && p->maxlength>maxLength){startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode));q->start = p->start;q->maxlength = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength;diskHead->maxlength = p->maxlength - maxLength;flag = 1;temp = p;if (diskHead->next == NULL) diskHead->next = q;else{while (temp->next) temp = temp->next;temp->next = q;}break;}p = p->next;}return flag;}void freeDisk(int startPostion){diskNode *p;for (p = diskHead; p != NULL; p = p->next){if (p->start == startPostion)break;}p->useFlag = false;}void fileDelet(){char fileName[10], command[50];int i, k;fflush(stdin);printf(" 输入文件名称:");gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++) fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q, *temp;q = userTable[userID].user;p = q->next;while (p){if (!strcmp(p->file->fileName, fileName)) break;else{p = p->next;q = q->next;}}if (p){if (p->file->openFlag != true)//先判断是否有进程打开该文件{temp = p;q->next = p->next;freeDisk(temp->file->start); //磁盘空间回收free(temp);printf("文件删除成功\n");system("pause");}else{printf("该文件正在被占用,删除失败\n");system("pause");}}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileRead(){int startPos, length;int k, i;char fileName[10], command[50];printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';k = 0;UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){startPos = p->file->start;length = p->file->length;p->file->openFlag = true;//文件打开标记printf("*****************************************************\n");for (int i = startPos; k<length; i++, k++){if (i % 50 == 0) printf("\n"); //一行大于 50 个字符换行printf("%c", disk[i]);}printf("\n\n*****************************************************\n");printf("%s 文件正在被占用 , 请先将其关闭\n", p->file->fileName);system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileWrite(){char fileName[10], command[50];int i, k, startPos;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){if (!strcmp(p->file->fileKind, "r"))//判断文件类型{printf("该文件是只读文件,写入失败\n");system("pause");return;}char str[500];printf("please input content:\n");gets(str);startPos = p->file->start;p->file->openFlag = true;//文件打开标记p->file->length = strlen(str);if (p->file->length>p->file->maxlength){printf("写入字符串长度大于该文件的总长度,写入失败\n");system("pause");return;}for (i = startPos, k = 0; k<(int)strlen(str); i++, k++) disk[i] = str[k];printf("文件写入成功,请将该文件关闭\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileFind(){char fileName[10], command[50];int i, k;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){printf("********************************************\n");printf("文件名:%s\n", p->file->fileName);printf("文件长度:%d\n", p->file->maxlength);printf("文件在存储空间的起始地址:%d\n", p->file->start);printf("文件类型:%s\n", p->file->fileKind);printf("创建时间:%s\n", asctime(p->file->timeinfo));printf("********************************************\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileChange(){char fileName[10], fileKind[10], command[50];int i, k;fflush(stdin);printf(" 输入文件名称和新的文件权限:");gets(command);for (i = 0, k = 0; command[i] != ' '; i++, k++) fileName[k] = command[i];fileName[k] = '\0';for (k = i + 1, i = 0; command[k] != '\0'; i++, k++) fileKind[i] = command[k];fileKind[i] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){strcpy(p->file->fileKind, fileKind);printf("修改文件类型成功\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileRename(){char fileName[10], fileRename[10], command[50];int i, k;fflush(stdin);printf(" 输入文件名称和新的文件名称:");gets(command);for (i = 0, k = 0; command[i] != ' '; i++, k++)fileName[k] = command[i];fileName[k] = '\0';for (k = i + 1, i = 0; command[k] != '\0'; i++, k++) fileRename[i] = command[k];fileRename[i] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){while (q->next){if (!strcmp(q->next->file->fileName, fileRename)){printf("您输入的文件名已存在,重命名失败\n");system("pause");return;}q = q->next;}strcpy(p->file->fileName, fileRename);printf("重命名成功\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileDir(){char userName[10], command[50];int i, k;printf(" 输入用户名称:");fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)userName[k] = command[i];userName[k] = '\0';UFD *p;for (i = 0; i<MaxUser; i++){if (!strcmp(userTable[i].userName, userName)){k = i;break;}}if (i == MaxUser){printf("没有找到该用户,请检查输入用户名是否正确\n");system("pause");return;}else{p = userTable[k].user->next;printf("******************************************************************* ************\n");printf("文件名文件长度文件在磁盘的起始地址文件类型创建时间\n");for (; p != NULL; p = p->next)printf("%s %d %d %s %s", p->file->fileName, p->file->maxlength,p->file->start, p->file->fileKind, asctime(p->file->timeinfo));printf("******************************************************************* *************\n");system("pause");}}void diskShow(){diskNode *p;int i = 0, unusedDisk = 0;printf("******************************************************************* *******\n");printf(" 盘块号起始地址容量(bit) 是否已被使用\n");for (p = diskHead; p != NULL; p = p->next, i++){if (p->useFlag == false) unusedDisk += p->maxlength;printf(" %d %d %d %d\n", i, p->start, p->maxlength, p->useFlag);}printf("******************************************************************* ********\n");printf(" 磁盘空间总容量:512*1024bit 已使用:%dbit末使用:%dbit\n", MaxDisk - unusedDisk, unusedDisk);system("pause");}void fileClose(){char fileName[10], command[50];int i, k;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; command[i] != '\0'; i++, k++)fileName[k] = command[i];fileName[k] = '\0';UFD *p, *q;q = userTable[userID].user;for (p = q->next; p != NULL; p = p->next){if (!strcmp(p->file->fileName, fileName))break;}if (p){p->file->openFlag = false;printf("%s 文件已关闭\n", p->file->fileName);system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}4.实验结果1、创建用户2、登录用户3、查看用户4、删除用户5、创建文件6、删除文件7、写入文件8、查看文件内容9、重命名10、查看文件属性11、查看用户文件12、关闭文件13、修改文件权限14、查看磁盘使用情况15、返回上级目录5.实验过程中出现的问题及解决办法。
实验3 操作系统文件管理实验报告
实验3 操作系统文件管理
班级_________________ 学号_________________ 姓名_________________ 1.DOS目录、文件夹和文件
1)说明以下命令的功能。
a)dir命令
b)cd命令
c)mkdir命令
d)copy命令
e)echo命令
f)copy命令
g)del命令
h)rd命令
(提示:可以使用/?开关参数来查看命令的说明。
)
2)回答以下问题
a)dir、dir /p 和dir /w显示结果有什么不同?
b)当输入错误命令时,会发生什么现象?
c)当输入dir /?会显示些什么?命令参数“/?”有什么意义?
d)如何显示驱动器C上以及驱动器D上的目录?
e)如何删除以“new”开头的文件?
f)如何创建名为paper的目录?
g)如何把扩展名为.doc的文件复制到paper目录?
h)如何删除paper目录?
i)在当前目录下使用dir,显示出来的文件信息中包括:“.”和“..”两个目录分别什么含义?2.实验心得体会:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三文件系统实验
一.目的要求
1. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2. 要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二.例题:
●设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行
用户可以打开5个文件。
●程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
●为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读
写指针,并不进行实际的读写操作
●算法与框图:
1.因系统小,文件目录的检索使用了简单的线性搜索。
2.文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位
为0,则表示不允许读写、执行。
3.程序中使用的主要设计结构如下:
●主文件目录和用户文件目录(MFD、UFD)
●打开文件目录(AFD)(即运行文件目录)
MDF:
(1)用户名
(2)文件目录指针
(3)用户名
(4)文件目录指针
UFD
(1)文件名
(2)保护码
(3)文件长度
(4)文件名
AFD
(1)打开文件名
(2)打开保护码
(3)读写指针
文件系统算法的流程图如下:
三.实验题:
1.增加2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,
更换文件名,改变文件保护级别)。
2.编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信
息,不需要打入冗长的命令。
3.设计一个树型目录结构的文件系统,其根目录为root,各分支可以是目录,
也可以是文件,最后的叶子都是文件。
4.根据学校各级机构,编制一文件系统。