搜档网
当前位置:搜档网 › 操作系统文件系统实验

操作系统文件系统实验

操作系统文件系统实验
操作系统文件系统实验

实验四文件系统实验

一.实验题目:

文件系统实验

二.实验目的:

阅读并调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

了解设计一个n个用户的文件系统,每个用户可以保存M个文件。用户在一次运行中只能打开一个文

件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令.

三.实验设备及环境:

1. 硬件设备:PC机一台

2. 软件环境:安装Windows操作系统,C语言软件。

四.实验内容及要求:

在阅读所给文件系统源程序的基础上,画出其实现的详细流程图,并给出有关的数据结构和说明。

五. 实验方法内容

1.算法流程图

(2)void Execute(int i,int len,int cmdset)执行命令函数流程图

(3)创建文件

(4)写文件流程图

(5)修改文件执行权限

(6

2.主要的常量变量

char cmd[64]; //存放用户输入命令

char buffer[36];

char user[32];//存放当前登陆的用户名

typedef char ALFA[12];

ALFA KWORD[keynum];

struct UFD{//用户文件管理模块

char filename[32]; //文件名

int safecode; //文件保护码

long length; //文件长度

}*curfile = NULL;

struct MFD{//用户登陆信息管理模块

char username[32]; //用户名

bool filepoint; //用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件

}*curuser = NULL,*elseuser=NULL;

typedef UFD UFD;

typedef MFD MFD;

3.主要模块

void KeyWord()//初始化命令关键字

int LoginDisplay() //登陆选项操作函数

bool Login(int SELETE)//用户登陆,注册函数

void DisplayUFD()//打印用户信息,包括用户的各个文件

//名称、长度和操作权限的设置信息

void ByeFile(bool BOOL)//注销函数,调用次函数用户可以退出系统

bool ClearUserFile()//用户要将自己的注册目录从系统彻底删除

//首先将该用户目录下的全部文件删除

void ClearUserMes()//删除用户全部信息

void CreatFile()//在当前用户目录下创建文件

void DeleteFile() //删除当前目录下一个文件的操作

void ListAllFile()//显示当前用户目录下的文件信息

bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件

//当该文件的权限允许当前用户对其执行有关操作时,返回ture

bool QueryMod(bool BOOL)//查询权限

bool WriteRight(int len,bool BOOL)//查看是否已经正确地写入到该文件信息中

void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中

void WriteFile()//向文件写入信息的操作

void ReadFile()//读文件函数

void ChangeMod()//修改某文件的执行权限

void Execute(int i,int len,int cmdset)//执行命令函数

void Command()//读取用户输入的命令,并将其转换成系统能识别的命令

void main()

4.代码

/***************************************************************** * 文件名: Simple_file_system.c

* 功能: 简单文件管理系统模拟程序

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

#include

#include

#include

#include

#include "conio.h"

#include

#define NULL 0

#define keynum 10

#define getspace(type) (type*)malloc(sizeof(type))

char cmd[64]; //存放用户输入命令

char buffer[36];//

char user[32];//存放当前登陆的用户名

typedef char ALFA[12];

ALFA KWORD[keynum];

//------------------------------------------------------------------------------------------------

struct UFD{//用户文件管理模块

char filename[32]; //文件名

int safecode; //文件保护码

long length; //文件长度

}*curfile = NULL;

//------------------------------------------------------------------------------------------------

struct MFD{//用户登陆信息管理模块

char username[32]; //用户名

bool filepoint; //用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件

}*curuser = NULL,*elseuser=NULL;

typedef UFD UFD;

typedef MFD MFD;

void main();

//------------------------------------------------------------------------------------------------

void KeyWord()//初始化命令关键字

{

strcpy(KWORD[ 1],"bye"); strcpy(KWORD[ 2],"chmod");

strcpy(KWORD[ 3],"close"); strcpy(KWORD[ 4],"create");

strcpy(KWORD[ 5],"delete"); strcpy(KWORD[ 6],"list");

strcpy(KWORD[ 7],"open"); strcpy(KWORD[ 8],"read");

strcpy(KWORD[ 9],"write");

}

//------------------------------------------------------------------------------------------------

int LoginDisplay() //登陆选项操作函数

{

int SELETE_1 = 0;

do

{

cout<<" *****请选择操作*****\n1、用户登陆 2、用户注册 0、退出"<

cin>>SELETE_1;

}while(SELETE_1<0 || SELETE_1>2);

system("cls");

return SELETE_1;

}

//------------------------------------------------------------------------------------------------

bool Login(int SELETE)//用户登陆,注册函数

{

FILE *fp,*fp1,*fp2;

char name[12];

switch(SELETE)

{

case 1://用户登陆

if((fp = fopen("LOGIN.exe","rb")) == NULL)//打开用户注册目录管理文件

{

cout<<"\n错误:不能打开登陆文件。"<

getch();system("cls");

return false;

}

curuser = getspace(MFD);

cout<<"\n*****登陆*****\n用户名:";

cin>>name; //输入用户登陆名

while(!feof(fp)) //检查该用户是否合法

{

fread(curuser,sizeof(MFD),1,fp);

if(strcmp(curuser->username,name)==0)

break;

}

if(feof(fp)) //如果没有找到跟当前登陆用户名相同的管理信息,提示出错

{

cout<<"\n错误:该用户不存在。"<

fclose(fp);

return false;

}

else

{

fclose(fp);

return true;

}

break;

case 2: //新用户注册

if((fp=fopen("LOGIN.exe","ab"))==NULL)//如果登陆信息管理文件不存在fp=fopen("LOGIN.exe","wb+"); //创建该信息管理文件

char name[12];

curuser = getspace(MFD);

while(1)

{

cout<<"\n *****新用户注册*****"<

cout<<"用户名:";

cin>>name; //输入用户注册名

fp1 = fopen("LOGIN.exe","rb");

while(!feof(fp1))//查看该用户名是否被别的用户占用

{

fread(curuser,sizeof(MFD),1,fp1);

if(strcmp(curuser->username,name) == 0) //该名称已经被使用

{

cout<<"\n该用户已经存在,请重新输入!"<

getch();

break;

}

}

if(feof(fp1))//该名称没有被别的用户占用

{

strcpy(curuser->username,name);

curuser->filepoint = NULL;

fwrite(curuser,sizeof(MFD),1,fp);

strcpy(user,curuser->username); //生成用户文件管理模块

strcat(user,".exe"); //用于管理用户目录下的各个文件

fp2=fopen(user,"wb+");

fclose(fp2);

cout<<"\n注册成功!"<

fclose(fp1);

fclose(fp);

break;

}

}

fp = fopen("LOGIN.exe","rb"); //显示当前注册用户的名称

while(1)

{

fread(curuser,sizeof(MFD),1,fp);

if(feof(fp))

break;

cout<username<

getch();

}

fclose(fp);

return true;

break;

default:

return false;

break;

}

}

//------------------------------------------------------------------------------------------------

void DisplayUFD()//打印用户信息,包括用户的各个文件

//名称、长度和操作权限的设置信息

{

if(curuser->filepoint == false) //当前用户目录下没有任何文件存在cout<<"\n用户 "<username<<" 文件夹是空的"<

else

{//存在文件,将所有文件信息打印在终端

FILE *fp;

char filename[12];

strcpy(filename,curuser->username);

strcat(filename,".exe");

if((fp=fopen(filename,"rb"))==NULL) //打开用户文件信息管理模块

{

cout<<"\n无法打开用户:"<username<<" 的文件!"<

getch();

return;

}

else

{//读入并将用户全部文件信息打印在终端

cout<<"用户:"<username<<"目录下的文件:"<

UFD *ufd;

int i=0;

ufd = getspace(UFD); //申请存放用户文件模块的空间

while(1)

{

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp))//全部输出完毕,结束

break;

else//打印信息

cout<filename<<"\t"<length<<"\t"<safecode<

}

}

fclose(fp);

}

}

//------------------------------------------------------------------------------------------------

void ByeFile(bool BOOL)//注销函数,调用次函数用户可以退出系统

{

FILE *infile,*outfile;

char out[50];

strcpy(out,"outfilelocate.exe");

if((infile=fopen("LOGIN.exe","rb"))==NULL)

{

cout<<"\n保存错误。"; //fclose(infile);

return;

}

else

{

if((outfile=fopen(out,"wb+"))==NULL) //申请一个缓冲区管理模块

//存放用户更新后的全部信息

{

cout<<"\n保存错误。";// fclose(outfile);

fclose(infile);return;

}

else

{

MFD *mfd = getspace(MFD);

while(1)

{ //将旧文件管理信息读出,并保存到新的文件信息管理模块中

fread(mfd,sizeof(MFD),1,infile);

if(feof(infile))

break;

if((strcmp(mfd->username,curuser->username))==0)

{

if(BOOL)//更新当前用户信息的操作

fwrite(curuser,sizeof(MFD),1,outfile);

else continue; //如果用户想把自己的注册目录从系统中彻底删除

//则执行该操作

}

else

fwrite(mfd,sizeof(MFD),1,outfile); //写入新的模块

}

fclose(infile);fclose(outfile);

remove("LOGIN.exe"); //将旧的该用户的文件管理模块删除

rename(out,"LOGIN.exe"); //将新的用户的文件管理模块重命名为用户目录下的

//管理模块

}

}

}

//------------------------------------------------------------------------------------------------

bool ClearUserFile()//用户要将自己的注册目录从系统彻底删除

//首先将该用户目录下的全部文件删除

{

FILE *fp;

char file[50];

strcpy(file,curuser->username);

strcat(file,".exe");

if((fp=fopen(file,"rb"))==NULL) //打开用户文件信息管理模块

{

// fclose(fp);

cout<<"\n该用户不存在!";return true;

}

else

{//将该用户目录下的文件逐个从磁盘删除

UFD *ufd = getspace(UFD);

while(1)

{

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp))

break;

else

remove(ufd->filename); //删除文件

}

fclose(fp);

return true;

}

}

//------------------------------------------------------------------------------------------------

void ClearUserMes()//删除用户全部信息

{

char name[50];

strcpy(name,curuser->username);

strcat(name,".exe");

remove(name); //从磁盘中删除用户文件信息管理模块

ByeFile(false); //更新系统的用户登陆信息管理模块

}

//------------------------------------------------------------------------------------------------

void DeleteUser()//删除用户注册目录的操作

{

char ch;

cout<<"\n该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!"<

cout<<"\n你确定要删除你在系统中的注册信息吗?Y/N"<

cin>>ch;

switch(ch) //提示用户确认删除

{

case 'Y':

case 'y':

if(ClearUserFile()) //如果用户的全部文件已经删除了

//则可以将该用户的文件信息管理模块也从磁盘中删除

//以免在没完全删除文件却删了该文件信息管理模块

//使得这些文件无法再进行管理造成磁盘空间的浪费

ClearUserMes(); //删除文件信息管理模块

break;

default:

cout<<"\n你取消了此操作!";

break;

}

}

//------------------------------------------------------------------------------------------------

void CreatFile()//在当前用户目录下创建文件

{

FILE *fp;

curuser->filepoint=true;

if((fp=fopen(buffer,"r"))==NULL) //如果没有跟用户输入文件名相同的文件{

if((fp=fopen(buffer,"w"))==NULL)

{

cout<<"\n创建文件失败!";

// fclose(fp);

return;

}

fclose(fp);

}

else

{ //用户要创建的文件已经存在

cout<<"\n该文件已经存在,创建另一个文件?Y/N";

char ch;

cin>>ch;

switch(ch)

{

case 'Y':

case 'y':

cout<<"\n输入新文件名:";

cin>>buffer;

strcat(buffer,".txt");

fclose(fp);

if((fp=fopen(buffer,"w"))==NULL)

{

cout<<"\n创建文件失败!";

// fclose(fp);

return;

}

fclose(fp);

break;

default:

fclose(fp);

return;

}

}

strcpy(user,curuser->username);

strcat(user,".exe");

curfile = getspace(UFD);

strcpy(curfile->filename,buffer); //文件名

curfile->length=0; //该文件长度为零

curfile->safecode=30; //设置该文件的默认权限

//11 00,文件主有读和写权,其他用户没有读写权if((fp=fopen(user,"ab"))==NULL)

{

cout<<"\n错误:你可能不是合法用户。"<

getch();

}

else

{

fwrite(curfile,sizeof(UFD),1,fp); //将该文件信息写入用户文件信息管理模块中

cout<<"\n文件 "<filename<<" 创建成功!";

}

fclose(fp);

}

void DeleteFile() //删除当前目录下一个文件的操作

{

char ch;

FILE *infile,*outfile;

cout<<"\n确定要删除文件:"<

cin>>ch;//提示用户确认删除

switch(ch)

{

case 'Y':

case 'y': //更新用户文件信息管理模块,这里同样使用缓冲区模块来更新 //方法与上面将到的类似

char out[50],in[50];

strcpy(out,"outfilelocate.exe");

strcpy(in,curuser->username);

strcat(in,".exe");

if((infile=fopen(in,"rb"))==NULL) //打开该用户的文件信息管理模块

{

cout<<"\n保存错误。";

//fclose(infile);

return;

}

else

{

if((outfile=fopen(out,"wb+"))==NULL)

{

cout<<"\n保存错误。"; // fclose(outfile);

fclose(infile);return;

}

else

{

UFD *ufd = getspace(UFD);

while(1)

{

fread(ufd,sizeof(UFD),1,infile); //从旧模块读出信息

if(feof(infile))

break;

if((strcmp(ufd->filename,buffer))==0) //要进行更新的信息

continue;

else

fwrite(ufd,sizeof(UFD),1,outfile); //写入新模块

}

fclose(infile);fclose(outfile);

remove(in); //在磁盘移除就模块

rename(out,in); //新模块命名为当前用户文件信息管理模块}

}

remove(buffer); //从磁盘中删除该文件

break;

default:

break;

}

}

void ListAllFile()//显示当前用户目录下的文件信息

{

DisplayUFD();

}

void WriteLengthToFile(int Len,bool BOOL);

void OpenFile()//在window模式下打开该文件

{

FILE *fp;

char ch;

int i=0;

system(buffer); //buffer为文件名,如:file1.txt

fp=fopen(buffer,"r");

while(1){ //获取新文件的长度

if(feof(fp))

break;

ch=fgetc(fp);

i++;

}

WriteLengthToFile(i,false);//将修改后的文件长度写入管理表

}

//------------------------------------------------------------------------------------------------

bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件

//当该文件的权限允许当前用户对其执行有关操作时,返回ture

{

FILE *fp;

char user[50];

UFD *ufd = getspace(UFD);//elseuser表示除当前用户外的所有用户注册目录

strcpy(user,elseuser->username);

strcat(user,".exe");

if((fp=fopen(user,"rb"))==NULL){//打开一个其它的用户文件信息管理模块

// fclose(fp);

cout<<"\n操作出现错误,对此我们表示歉意!";return false;

}

else{

while(1){

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp)){

fclose(fp);return false;

}

if(strcmp(ufd->filename,buffer)==0){

if(BOOL)//该用户请求写该文件

{

if(ufd->safecode== 31 || ufd->safecode== 33)

//1101、1111最后一位为1,有写权

return true;

else{

cout<<"\n你无权对文件 "<

flag=true;return false;}

//flag设置为true,告诉上一层,无须再查找

//该文件已经找到,但用户无权执行相关操作

}

else //该用户请求读权

{

if(ufd->safecode == 32 || ufd->safecode == 33)

//1110、1111倒数第二位为1,有读权

return true;

else{

cout<<"\n你无权对文件 "<

flag=true;return false;}

}

}

}

}

}

//------------------------------------------------------------------------------------------------

bool QueryMod(bool BOOL)//查询权限

{//首先在用户目录下查找,如果找不到用户当前要进行操作的文件名

//则在其它注册用户目录下查找

FILE *fp,*fp1;

bool flag=false;

char user[50];

UFD *ufd = getspace(UFD);

strcpy(user,curuser->username);

strcat(user,".exe");

if((fp=fopen(user,"rb"))==NULL){//打开用户文件信息管理模块

// fclose(fp);

cout<<"\n操作出现错误,对此我们表示歉意!";return false;

}

else{//查找匹配的文件名,用户目录下的文件允许用户进行读写操作

while(1){

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp)){ //在当前用户文件管理模块中找不到匹配文件

//则继续在其它用户注册目录下查找

fclose(fp);

fp1=fopen("LOGIN.exe","rb");

elseuser = getspace(MFD);

bool BOOL_1=false;

while(1){

fread(elseuser,sizeof(MFD),1,fp1); //读其它用户信息

if(feof(fp1) && !BOOL_1) //全部用户都查找完

//但仍然没找到匹配的文件

return false;

if(elseuser != curuser){

if((BOOL_1==QueryModElse(BOOL,flag)))//查找

return true;

if(flag)

return false;

}

}

}

if(strcmp(ufd->filename,buffer)==0){ //在当前用户注册目录下

//找到该文件,返回真值

fclose(fp);return true;

}

}

}

}

//------------------------------------------------------------------------------------------------

bool WriteRight(int len,bool BOOL)//查看是否已经正确地写入到该文件信息中

//是则返回真值

{

char user[50],outfile[50];

FILE *fp,*fp1;

strcpy(user,elseuser->username);

strcat(user,".exe");

if((fp=fopen(user,"rb"))==NULL){

// fclose(fp);

return false;

}

else{

UFD *ufd = getspace(UFD);

while(1){ //在此用户目录下查找匹配文件

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp)){

fclose(fp);return false;

}

if((strcmp(ufd->filename,buffer))==0){ //找到要写入新的长度的文件strcpy(outfile,"outfilelocate.exe");

if((fp1=fopen(outfile,"wb+"))==NULL){

cout<<"\n错误:写入文件长度出错_3。";

// fclose(fp1);

fclose(fp);return false;

}

else{

fclose(fp);

fp=fopen(user,"rb"); //文件指针从新指向此用户文件信息管理模

//块开头

while(1){

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp))

break;

if(strcmp(ufd->filename,buffer)==0){ //找到匹配的文件

if(BOOL) ufd->length+=len; //在文件末追加内容的操作

else ufd->length =len; //覆盖原文件内容

}

fwrite(ufd,sizeof(UFD),1,fp1);

}

fclose(fp);fclose(fp1);

remove(user);

rename(outfile,user);

return true;

}

}

}

}

}

//------------------------------------------------------------------------------------------------

void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中

{//因为当前用户可以对其它用户的文件进行操作(只要权限允许)

//所以应该在整个文件系统目录下查找该文件的位置

FILE *fp;

if((fp=fopen("LOGIN.exe","rb"))==NULL){ //不能打开文件

cout<<"\n写入文件长度错误_1!";

// fclose(fp);

return;

}

else{

elseuser = getspace(MFD);

while(1){

fread(elseuser,sizeof(MFD),1,fp);

if(feof(fp))

break;

else{

if(WriteRight(Len,BOOL)){ //查看是否已经正确地写入到该文件信息中

fclose(fp);return;

}

}

}

cout<<"\n写入文件长度错误_2!";

fclose(fp);return;

}

}

//------------------------------------------------------------------------------------------------

void WriteFile()//向文件写入信息的操作

{

if(!QueryMod(true)) //查询当前用户对该文件是否有写权

return; //对该文件没有写权则返回

char ch;

int i=0;

FILE *fp;

if((fp=fopen(buffer,"r"))==NULL) //查询该文件是否存在

{

cout<<"\n该文件不存在,请创建该文件后再写入。";

// fclose(fp);

return;

}

fclose(fp);

cout<<"\n请选择写入方式:"<

cout<<" 1、覆盖原文件 2、在原文件末尾写入 3、取消"<

cin>>ch;

cout<<"开始输入正文:"<

switch(ch)

{

case '1'://覆盖原文件

if((fp=fopen(buffer,"w"))==NULL)

cout<<"\n文件打开失败。";

else

{

ch=getchar();

while(ch!='#') //将新的文件内容写入到文件的磁盘位置中

{

i++;

fputc(ch,fp);

ch=getchar();

}

}

fclose(fp);

WriteLengthToFile(i,false); //将文件长度写入文件管理模块

break;

case '2':

if((fp=fopen(buffer,"a"))==NULL)

cout<<"\n文件打开失败。";

else

{

ch=getchar();

while(ch!='#') //将新的文件内容写入到文件的磁盘位置中

{

i++;

fputc(ch,fp);

ch=getchar();

}

}

fclose(fp);

WriteLengthToFile(i,true); //将文件长度写入文件管理模块

break;

default:

break;

}

}

//------------------------------------------------------------------------------------------------

void ReadFile()//读文件函数

{

if(!QueryMod(false)) //查询当前用户是否有权读该文件

return; //没有读权,则返回

FILE *fp;

if((fp=fopen(buffer,"r"))==NULL) //打开该文件

{

cout<

cout<<"\n该文件不存在。";

return;

}

else{

char ch;

ch=fgetc(fp);

while(ch!=EOF) //将该文件信息逐一输出到终端

{

putchar(ch);

ch=fgetc(fp);

}

cout<

}

fclose(fp);

}

//------------------------------------------------------------------------------------------------

void ChangeMod()//修改某文件的执行权限

{

int mod=40;

FILE *fp,*infile,*outfile;

char in[50],out[50];

UFD *ufd = getspace(UFD);

strcpy(in,curuser->username);

strcat(in,".exe");

strcpy(out,"outfilelocate.exe");

if((fp=fopen(in,"rb"))==NULL){

// fclose(fp);

cout<<"\n操作出现错误,对此我们表示歉意!";return;

}

else{

while(1){ //查看该文件是否在当前用户的注册目录下

//任何用户无权修改不是自己目录下的文件的权限值

fread(ufd,sizeof(UFD),1,fp);

if(feof(fp)){ //在当前目录下找不到该文件,说明该用户无权修改该文件权限cout<<"\n你没有权限对文件 "<

fclose(fp);return;

}

if(strcmp(ufd->filename,buffer)==0){ //找到该文件,继续操作

fclose(fp);break;

}

}

}

bool flag1=true;

while(flag1)

{

cout<<"\n输入文件 "<

cin>>mod; //输入权限值

if(mod<30 || mod>33)

{//确保输入的权限值正确

cout<<"\n错误:权限值必须在30~33之间";

continue;

}

else{

char ch;

switch(mod){ //告诉用户对该文件权限修改的结果,以便用户确认

case 30:

cout<<"\n当前权限设置:其他用户对"<

break;

case 31:

cout<<"\n当前权限设置:其他用户对"<

break;

case 32:

cout<<"\n当前权限设置:其他用户对"<

break;

case 33:

cout<<"\n当前权限设置:其他用户对"<

break;

default: break;

}

cout<<"\n确认按'Y',取消按'N':";

cin>>ch;

switch(ch){

case 'Y':

case 'y':flag1=false;break;

default: flag1=true;

}

}

}

//更新文件信息管理模块,相关操作类似上面,不在赘述

if((infile=fopen(in,"rb"))==NULL){

cout<<"\n操作出现错误,对此我们表示歉意!";fclose(infile);

return;

}

else{

if((outfile=fopen(out,"wb+"))==NULL){

cout<<"\n操作出现错误,对此我们表示歉意!";

fclose(infile);//fclose(outfile);

return;

}

else{

while(1)

{

fread(ufd,sizeof(UFD),1,infile);

if(feof(infile))

break;

if((strcmp(ufd->filename,buffer))==0)

ufd->safecode=mod;

fwrite(ufd,sizeof(UFD),1,outfile);

}

fclose(infile);fclose(outfile);

remove(in);

rename(out,in);

}

}

}

//------------------------------------------------------------------------------------------------

void Execute(int i,int len,int cmdset)//执行命令函数

{

int j=0;

for(;i

{

if(cmd[i]=='>'||cmd[i]==' '){

// buffer[i] = '\0';

break;

}

/* if(i==len-1)

{

buffer[j]=cmd[i];

buffer[j+1]='\0';

break;

}*/

buffer[j]=cmd[i];j++;

}

buffer[j]='\0';

strcat(buffer,".txt");

switch(cmdset)

{

case 1: //退出

ByeFile(true);

system("cls");

break;

case 2: //改变文件操作权限

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

ChangeMod();

break;

case 3: //删除用户

DeleteUser();

break;

case 4: //创建文件

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

CreatFile();

break;

case 5: //删除文件

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

DeleteFile();

break;

case 6: //列出该用户所有文件清单

ListAllFile();

break;

case 7: //打开文件

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

OpenFile();

break;

case 8: //读文件

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

ReadFile();

break;

case 9: //写文件

if((strcmp(buffer,".txt"))==0){

cout<<"\n输入命令出错!";

return;

}

WriteFile();

break;

default:

break;

}

}

//------------------------------------------------------------------------------------------------

void Command()//读取用户输入的命令,并将其转换成系统能识别的命令

{

int len = 0,i,j;

int cmdset;

while(1)

{

cmdset = 0;

cout<<"\nrun\\";

cin>>cmd;

len = strlen(cmd);

i=0;j=0;

while(cmd[i]=='>'||cmd[i]==' '){i++;} //过滤空格键和'>'

for(;i

{

if(cmd[i]=='>' || cmd[i]==' ' || i==len-1)

{

if(cmd[i]=='>' || cmd[i]==' ')

buffer[j] = '\0';

else

if(i==len-1)

{

buffer[j]=cmd[i];

buffer[j+1]='\0';

}

i++;

j=0;

int low=1,mid,high=keynum-1;

bool BOOL = false;

while(low<=high){ //找到该命令关键字的内部识别码

mid=(low+high)/2;

if (strcmp(buffer,KWORD[mid])<=0) high=mid-1;

if (strcmp(buffer,KWORD[mid])>=0) low=mid+1;

if(strcmp(buffer,KWORD[mid])==0){

BOOL = true;

break;

}

}

if(!BOOL)

{

cout<<"\n"<

cmdset = 0; break;

}

else {cmdset = mid;break;}

}

else{

buffer[j] = cmd[i];

j++;

}

}

if(cmdset == 0) continue;

while(cmd[i]=='>'||cmd[i]==' '){i++;} //过滤空格键和'>'

buffer[0]='\0';

Execute(i,len,cmdset); //执行该命令

}

}

//------------------------------------------------------------------------------------------------

void main()

{

while(1){

int SELETE = LoginDisplay();

if(SELETE==0)

exit(0);

bool BOOL = Login(SELETE); //用户登陆,或者注册函数

if(BOOL)

{

KeyWord(); //初始化命令关键字

DisplayUFD(); //打印用户目录下的文件

Command(); //命令行操作

}

}

}

六、实验结果

1.执行结果

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

操作系统实验报告一

重庆大学 学生实验报告 实验课程名称操作系统原理 开课实验室DS1501 学院软件学院年级2013专业班软件工程2 班学生姓名胡其友学号20131802 开课时间2015至2016学年第一学期 总成绩 教师签名洪明坚 软件学院制

《操作系统原理》实验报告 开课实验室:年月日学院软件学院年级、专业、班2013级软件工 程2班 姓名胡其友成绩 课程名称操作系统原理 实验项目 名称 指导教师洪明坚 教师 评语教师签名:洪明坚年月日 1.实验目的: ?进入实验环境 –双击expenv/setvars.bat ?检出(checkout)EPOS的源代码 –svn checkout https://www.sodocs.net/doc/5c1647149.html,/svn/epos ?编译及运行 –cd epos/app –make run ?清除所有的临时文件 –make clean ?调试 –make debug ?在“Bochs Enhanced Debugger”中,输入“quit”退出调试 –调试指令,请看附录A 2.实验内容: ?编写系统调用“time_t time(time_t *loc)” –功能描述 ?返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc 非NULL,则返回值也被填到loc所指向的内存位置 –数据类型time_t其实就是long ?typedef long time_t; 3.实验步骤: ?Kernel space –K1、在machdep.c中,编写系统调用的实现函数“time_t sys_time()”,计算用户秒数。需要用到 ?变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1午夜的秒数 ?变量g_timer_ticks

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

操作系统实验报告心得体会

操作系统实验报告心得体会 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。 不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,

慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

操作系统实验报告

操作系统实验报告 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

实验二进程调度1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言 4设计思想: (1)程序中进程可用PCB表示,其类型描述如下:

structPCB_type { intpid;//进程名 intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 intcpu_time;//运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next; } 并设全程量: structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指 针

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 2014年3 月29 日

一、实验目的 ◆熟悉hit-oslab实验环境; ◆建立对操作系统引导过程的深入认识; ◆掌握操作系统的基本开发过程; ◆能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。 二、实验容 1. 阅读《Linux核完全注释》的第6章引导启动程序,对计算机和Linux 0.11的引导过程进行初步的了解。 2. 按照下面的要求改写0.11的引导程序bootsect.s。 3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。 4. 修改build.c,以便可以使用make BootImage命令 5. 改写bootsect.s主要完成如下功能: bootsect.s能在屏幕上打印一段提示信息XXX is booting...,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等。 6. 改写setup.s主要完成如下功能: bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s 向屏幕输出一行"Now we are in SETUP"。setup.s能获取至少一个基本的硬件参数(如存参数、显卡参数、硬盘参数等),将其存放在存的特定地址,并输出到屏幕上。setup.s不再加载Linux核,保持上述信息显示在屏幕上即可。 三、实验环境

本实验使用的系统是windows系统或者是Linux系统,需要的材料是osexp。 四、实验步骤 1. 修改bootsect.s中的提示信息及相关代码; 到osexp\Linux-0.11\boot目录下会看到图1所示的三个文件夹,使用UtraEdit 打开该文件。将文档中的98行的mov cx,#24修改为mov cx,#80。同时修改文档中的第246行为图2所示的情形。 图1图2 图3 2. 在目录linux-0.11\boot下,分别用命令as86 -0 -a -o bootsect.obootsect.s和 ld86 -0 -s -obootsectbootsect.o编译和bootsect.s,生成bootsect文件; 在\osexp目录下点击MinGW32.bat依此输入下面的命令: cd linux-0.11 cd boot as86 -0 -a -o bootsect.obootsect.s ld86 -0 -s -o bootsectbootsect.o

操作系统实验报告

《操作系统原理》实验报告 实验项目名称:模拟使用银行家算法判断系统的状态 一、实验目的 银行家算法是操作系统中避免死锁的算法,本实验通过对银行家算法的模拟,加强对操作系统中死锁的认识,以及如何寻找到一个安全序列解除死锁。 二、实验环境 1、硬件:笔记本。 2、软件:Windows 7 , Eclipse。 三、实验内容 1.把输入资源初始化,形成资源分配表; 2.设计银行家算法,输入一个进程的资源请求,按银行家算法步骤进行检查; 3.设计安全性算法,检查某时刻系统是否安全; 4.设计显示函数,显示资源分配表,安全分配序列。 四、数据处理与实验结果 1.资源分配表由进程数组,Max,Allocation,Need,Available 5个数组组成; 实验采用数据为下表: 2.系统总体结构,即菜单选项,如下图

实验的流程图。如下图 3.实验过程及结果如下图所示

1.首先输入进程数和资源类型及各进程的最大需求量 2.输入各进程的占有量及目前系统的可用资源数量 3.初始化后,系统资源的需求和分配表 4.判断线程是否安全

5.对线程进行死锁判断 五、实验过程分析 在实验过程中,遇到了不少问题,比如算法无法回滚操作,程序一旦执行,必须直接运行到单个任务结束为止,即使产生了错误,也必须等到该项任务结束才可以去选择别的操作。但总之,实验还是完满的完成了。 六、实验总结 通过实验使我对以前所学过的基础知识加以巩固,也对操作系统中抽象理论知识加以理解,例如使用Java语言来实现银行家算法,在这个过程中更进一步了解了银行家算法,通过清晰字符界面能进行操作。不过不足之处就是界面略显简洁,对于一个没有操作过计算机的人来说,用起来可能还是有些难懂。所以,以后会对界面以及功能进行完善,做到人人都可以看懂的算法。

操作系统文件管理_答案

第六部分文件管理 1、文件系统的主要目的就是( )。 A、实现对文件的按名存取 B、实现虚拟存储 C、提供外存的读写速度 D、用于存储系统文件 2、文件系统就是指( )。 A、文件的集合 B、文件的目录集合 C、实现文件管理的一组软件 D、文件、管理文件的软件及数据结构的总体 3、文件管理实际上就是管理( )。 A、主存空间 B、辅助存储空间 C、逻辑地址空间 D、物理地址空间 4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构就是( )。 A、顺序文件 B、链接文件 C、索引文件 D、系统文件 5、下列描述不就是文件系统功能的就是( )。 A、建立文件目录 B、提供一组文件操作 C、实现对磁盘的驱动调度 D、实现从逻辑文件到物理文件间的转换 6、文件系统在创建一个文件时,为它建立一个( )。 A、文件目录 B、目录文件 C、逻辑结构 D、逻辑空间 7、索引式(随机)文件组织的一个主要优点就是( )。 A、不需要链接指针 B、能实现物理块的动态分配 C、回收实现比较简单 D、用户存取方便 8、面向用户的文件组织机构属于( )。 A、虚拟结构 B、实际结构 C、逻辑结构 D、物理结构 9、按文件用途来分,编译程序就是( )。 A、用户文件 B、档案文件 C、系统文件 D、库文件 10、将信息加工形成具有保留价值的文件就是( )。 A、库文件 B、档案文件 C、系统文件 D、临时文件 11、文件目录的主要作用就是( )。 A、按名存取 B、提高速度 C、节省空间 D、提高外存利用率 12、如果文件系统中有两个文件重名,不应采用( )。 A、一级目录结构 B、树型目录结构 C、二级目录结构 D、A与C 13、文件系统采用树型目录结构后,对于不同用户的文件,其文件名( )。 A、应该相同 B、应该不同 C、可以不同,也可以相同 D、受系统约束 14、文件系统采用二级文件目录可以( )。 A、缩短访问存储器的时间 B、实现文件共享 C、节省内存空间 D、解决不同用户间的文件命名冲突

操作系统实验文件管理C 代码

#include #include #include #include #include using namespace std; #define BLKSIZE 512 // 数据块的大小 #define BLKNUM 512 // 数据块的块数 #define INODESIZE 32 // i节点的大小 #define INODENUM 32 // i节点的数目 #define FILENUM 8 // 打开文件表的数目//用户 typedef struct { char user_name[10]; // 用户名 char password[10]; // 密码 } User; //i节点 typedef struct { short inum; // 文件i节点号 char file_name[10]; // 文件名

char type; // 文件类型 char user_name[10]; // 文件所有者 short iparent; // 父目录的i节点号 short length; // 文件长度 short address[2]; // 存放文件的地址 } Inode; //打开文件表 typedef struct { short inum; // i节点号 char file_name[10]; // 文件名 short mode; // 读写模式(1:read, 2:write, // 3:read and write) } File_table; // 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int);

操作系统实验报告

操作系统实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的启动和退出方 法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装,期间完成网络 信息、用户信息、文件系统和硬盘分区等配置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装,并通过LILO或 者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结构,并列举出 Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示: 2、点击下一步,选择经典型,点击下一步在选择客户机页面选择 Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小 10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM (IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点 击“浏览”,找到Linux的镜像文件,如图所示:

操作系统实验报告16487

西安邮电大学 (计算机学院) 课实验报告 实验名称:进程管理 专业名称:计算机科学与技术 班级: 学生: 学号(8位): 指导教师: 实验日期:*****年**月**日

一. 实验目的及实验环境 目的:(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 环境:Linux操作系统环境: 二. 实验容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 三.方案设计 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! 程序流程图如下:

操作系统实验报告

操作系统实验报告 银行家算法 班级:计算机()班 姓名:李君益 学号:(号) 提交日期: 指导老师: 林穗 一、设计题目 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。 二、设计要求

内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 要求: (1)下列状态是否安全?(三个进程共享个同类资源) 进程已分配资源数最大需求数 (状态) (状态) (2)考虑下列系统状态 分配矩阵最大需求矩阵可用资源矩阵 问系统是否安全?若安全就给出所有的安全序列。若进程请求(),可否立即分配? 三、设计分析 一.关于操作系统的死锁 .死锁的产生 计算机系统中有许多独占资源,他们在任一时刻只能被一个进程使用,如磁带机,绘图仪等独占型外围设备,或进程表,临界区等软件资源。两个进程同时向一台打印机输出将导致一片混乱,两个进程同时进入临界区将导致数据库错误乃至程序崩溃。正因为这些原因,所有操作系统都具有授权一个进程独立访问某一辞源的能力。一个进程需要使用独占型资源必须通过以下的次序: ●申请资源 ●使用资源 ●归还资源 若申请施资源不可用,则申请进程进入等待状态。对于不同的独占资源,进程等待的方式是有差别的,如申请打印机资源、临界区资源时,申请失败将一位这阻塞申请进程;而申请打开文件文件资源时,申请失败将返回一个错误码,由申请进程等待一段时间之后重试。只得指出的是,不同的操作系统对于同一种资源采取的等待方式也是有差异的。 在许多应用中,一个进程需要独占访问多个资源,而操作系统允许多个进程并发执行共享系统资源时,此时可能会出现进程永远被阻塞的现象。这种现象称为“死锁”。 2.死锁的定义 一组进程处于死锁状态是指:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的时间,则称一组进程或系统此时发生了死锁。 .死锁的防止 .死锁产生的条件: ●互斥条件

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

操作系统实验报告.

学生学号0121210680225 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称操作系统 开课学院计算机科学与技术学院 指导老师姓名刘军 学生姓名李安福 学生专业班级软件sy1201 2014 — 2015 学年第一学期

《操作系统》实验教学大纲 课程编号: 课程名称:操作系统/Operating System 实验总学时数:12学时 适应专业:计算机科学与技术、软件工程 承担实验室:计算机科学与技术学院实验中心 一、实验教学的目的和任务 通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。 二、实验项目及学时分配 序号实验项目名称实验学时实验类型开出要求 01 Linux键盘命令和vi 2 设计必开 02 Linux下C编程 2 设计必开 03 SHELL编程和后台批处理 2 设计必开 04 Linux系统调用(time) 2 设计必开 05 Linux进程控制(fork) 4 设计必开 三、每项实验的内容和要求: 1、Linux键盘命令和vi 要求:掌握Linux系统键盘命令的使用方法。 内容:见教材p4, p9, p40, p49-53, p89, p100 2、Linux下的C编程 要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。 内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。 3、SHELL编程和后台批处理 要求:掌握Linux系统的SHELL编程方法和后台批处理方法。 内容:(1) 将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。 (2) 将上面SHELLL程序后台运行。观察原C程序运行时输入输出情况。 (3) 修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键 盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容, 然后输出到屏幕。 4、Linux系统调用使用方法。

兰州大学操作系统实验七存储管理题目和答案

实验七实验报告 实验名称:7 存储管理 实验目的: 1.观察系统存储器使用情况 2.观察进程使用存储器的情况 3.掌握通过内存映像文件提高性能的方法 4.掌握动态内存分配技术 实验时间 3学时 预备知识: 1.存储相关的命令 free 显示系统使用和未被使用的内存数量(可以实时执行) 输出包含的标题有 3 行信息: Mem。此行包含了有关物理内存的信息。包括以下详细内容: total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的 容量,是因为内核本身也要使用一小部分的内存。 used。该项显示了用于应用程序超速缓存数据的内存容量。 free。该项显示了此时未使用且有效的内存容量。 Shared/buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。 -/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。 free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。 Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。 vmstat 报告进程、内存、分页、IO等多类信息(使用手册页) size 列出目标文件段大小和总大小(使用手册页)

2./proc文件系统(使用手册页man 5 proc) /proc/meminfo 内存状态信息 /proc/stat 包含内存页、内存对换等信息。 /proc/$pid/stat 某个进程的信息(包含内存使用信息) /proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。 /proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。 3.内存映像文件 内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。 3.1 mmap(建立内存映射) 表头文件#include #include 定义函数void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。 参数prot代表映射区域的保护方式有下列组合 PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 参数flags会影响映射区域的各种特性 MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。 MAP_PRIV A TE 对映射区域的写入操作会产生一个映射文件的复制,即私人的

操作系统实验报告

操作系统实验报告班级:软件1042 姓名:****** 学号:101***** 指导老师:***老师 安徽工业大学工商学院2012年12月

目录 实验一 WINDOWS进程初识 (2) 1、实验目的 (2) 2、实验内容和步骤 (2) 3、实验结论 (4) 实验二进程管理 (4) 1、实验目的 (4) 2、实验内容和步骤 (4) 3、实验结论 (9) 实验三进程同步的经典算法 (9) 1、实验目的 (9) 2、实验内容和步骤 (10) 3、实验结论 (12) 实验四存储管理 (12) 1、实验目的 (12) 2、实验内容和步骤 (12) 3、实验结论 (19)

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 刚开始由于命令输入有误经改正后,正确调试出结果 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) :

操作系统实验报告-实验四

操作系统实验报告-实验四

实验四:进程管理(二) 实验内容: 1.编写一个程序,打印进程的如下信息:进程标识符,父进程标识符,真实用户ID,有效用户ID,真实用户组ID,有效用户组ID。并分析真实用户ID和有效用户ID的区别。 源代码及结果: 真实用户ID和有效用户ID的区别: 真实用户ID:这个ID就是我们登陆unix 系统时的身份ID。 有效用户ID:定义了操作者的权限。有效用户ID是进程的属性,决定了该进程对文件的访问权限。 2.阅读如下程序,编译并运行,分析进程执行过程的时间消耗(总共消耗的时间和CPU

消耗的时间),并解释执行结果。再编写一个计算密集型的程序替代grep,比较两次时间的花销。注释程序主要语句。 /* process using time */ #include #include #include #include #include void time_print(char *,clock_t); int main(void){ //取得进程运行相关的时间 clock_t start,end; struct tms t_start,t_end; start = times(&t_start); system(“grep the /usr/doc/*/* > /dev/null 2> /dev/null”); /*command >/dev/null的作用是将是command命令的标准输出丢弃,而标准错误输出还是在屏幕上。一般来讲标准输出和标准

操作系统 实验报告 文件管理

昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第二学期) 课程名称:操作系统开课实验室:年月日 一、实验目的 用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而 对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验原理及基本技术路线图(方框原理图) 用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。 功能设计: Help 显示命令帮助 dir 显示当前目录下的文件和文件夹 exit 退出系统 create [文件名] 创建文本文件 cdir [目录名] 创建文件夹 read [文件名] 读取一个文件最多可同时读取五个 close[文件名] 关闭一个文件 edit [文件名] 编辑一个文件 cd [目录名] 进子目录或者上级目录 attr [文件名] 显示该文件的属性 del [文件名] 删除文件 rename [文件名] 重命名

编辑功能流程图

删除文件流程图创建文件流程图 核心算法: bool Format(void); //格式化 bool install(void); //装载虚拟硬盘的数据 void login(void); /用户登陆

void showMenu(void);//显示功能菜单 bool onAction(void);//用户选择功能并执行 void createFile(string str);//创建文件 bool read(string str);//读取文件 void editFile(string str);//编辑文件 void Delete(string str);//删除一个文件 数据结构: /*---------常变量------*/ const unsigned int BLOCK_SIZE=512; //块长 const unsigned int DATA_BLOCK_NUM=512; //数据块数量 const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置 const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=32; //inode数量 const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址 const unsigned int ACCOUNT_NUM=10; //用户数量 /*inode结构体*/ struct inode{ unsigned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:"."和".."*/ unsigned short di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户0为根目录ID,一次下去是管理员目

操作系统实验报告

本科实验报告 课程名称:操作系统学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院 2016年 12 月日

实验(实验1) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。

【操作要求】安装Linux操作系统,版本不限。 Linux发行版本: Linux内核版本: 【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机

4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标 【操作步骤2】主菜单

相关主题