广工_操作系统_课程设计_源代码

合集下载

广工_操作系统_课程设计_源代码

广工_操作系统_课程设计_源代码

课程设计课程名称________操作系统___ ____题目名称_多用户多级目录文件系统的实现_ 学生学院________计算机学院____________专业班级______ _________学号________ ___________学生姓名_________ _____________指导教师__________林穗______________2011年1月18日广东工业大学课程设计任务书题目名称多用户多级目录文件系统的实现学生学院计算机学院专业班级08软件工程一班姓名学号一、课程设计的内容本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

二、课程设计的要求与数据1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2.文件物理结构可采用显式链接或其他方法。

3.磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。

5.设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建:create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout6.系统必须可实际演示,选用程序设计语言:C++、C等。

#操作系统课程设计-银行家算法(流程图 源代码 设计报告)

#操作系统课程设计-银行家算法(流程图 源代码 设计报告)

操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。

二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。

三、实验内容:1、设计一个结构体,用于描述每个进程对资源的要求分配情况。

包括:进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。

2、编写三个算法,分别用以完成:①申请资源;②显示资源;③释放资源。

(动态完成)四、程序流程图五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改# define NP 10*//* # define NS 5 */ /*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*//*四、程序流程图:五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改#define NP10*//* #define NS5*//*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include "string.h"#include "stdio.h"#include"dos.h"#include"conio.h"#define MOVEIN1#define GUIYUE2#define ACC3#define OK1#define ERROR0#define MAXSH7#define MAXSHL10#define MAXINPUT50#define maxsize 100int act;int ip=0;int line=0; /*line为要写的行号,全局变量*/int writeok;int right;char wel[30]={"Welcome To Use An_Li System"};char ente[76]={" 警告:未经作者同意不得随意复制更改!"};char rights[40]={"Copyright (c)2002"};struct date today;sssssssssssss;ttttttttttttt{int data[maxsize];int top;}stack;int emptystack(stack*S){if(S->top==48&&S->data[S->top]==35)return(1); /*35is'#'*/else return(0);}int push(stack*S,int x){if(S->top>=maxsize-1)return(-1);else{S->top++;S->data[S->top]=x;return(0);}int gettop(stack*S){return S->data[S->top];}int pop(stack*S){if(emptystack(S)){printf("the stack is empty\n");exit(1);}else S->top--;return S->data[S->top+1];}void initstack(stack*S){int i;S->top=0;S->data[S->top]=35;}/*****模拟打字机的效果*********/delay_fun(){int i;void music();for(i=0;;i++){if(wel!='\0'){delay(1000);textcolor(YELLOW);gotoxy(26+i,8);cprintf("%c",wel);printf("谢谢");printf("网络");music(1,60);}else break;}delay(500000);for(i=0;;i++){if(ente!='\0'){delay(1000);textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);cprintf("%c",ente);}else break;}delay(40000);for(i=0;;i++){if(rights!='\0'){delay(1000);textcolor(YELLOW);gotoxy(30+i,14);cprintf("%c",rights);music(1,60);}elsebreak;}getch();}/*********登陆后的效果**********/ logined(){int i;clrscr();gotoxy(28,10);textcolor(YELLOW);cprintf("程序正在载入请稍候....."); gotoxy(35,12);for(i=0;i<=50;i++){gotoxy(40,12);delay(8000);cprintf("%02d%已完成",i*2);gotoxy(i+15,13);cprintf("\n");cprintf("|");}main0();}/*********对PC扬声器操作的函数****/void music(int loop,int f)/*f为频率*/ {int i;for(i=0;i<30*loop;i++){sound(f*20);}int analys(int s,int a){int hh,pos;switch(a){case(int)'i':hh=0;break;case(int)'+':hh=1;break;case(int)'*':hh=2;break;case(int)'(':hh=3;break;case(int)')':hh=4;break;case(int)'#':hh=5;break;case(int)'E':hh=6;break;case(int)'T':hh=7;break;case(int)'F':hh=8;break;default:{printf("\n analys()分析发现不该有的字符%c!(位置:%d)",a,ip+1); writeerror('0',"\n............分析出现错误!!!");writeerror(a,"\n 错误类型: 不该有字符");printf("谢谢");printf("网");return ERROR;}}pos=(s-48)*10+hh;switch(pos){case3:case43:case63:case73:act=4;return MOVEIN;case0:case40:case60:case70:act=5;return MOVEIN;case11:case81:act=6;return MOVEIN;case92:case22:act=7;return MOVEIN;case84:act=11;return MOVEIN;/*-------------------------------------------*/case91:case94:case95:act=1;return GUIYUE;case21:act=2;return GUIYUE;case101:case102:case104:case105:act=3;return GUIYUE;case31:case32:case34:case35:act=4;return GUIYUE;case111:case112:case114:case115:act=5;return GUIYUE;case51:case52:case54:case55:act=6;return GUIYUE;/*+++++++++++++++++*/case15:return ACC;/*******************************/case6:return1;case7:case47:return2;case8:case48:case68:return3;case46:return8;case67:return9;case78:return10;default:{if(a=='#')printf("");else printf("\n analys() 分析发现字符%c 不是所期望的!(位置:%d)",a,ip+1);writeerror('0',"\n...........分析出现错误!!!");writeerror(a,"\n 错误类型: 字符");writeerror('0'," 不是所期望的!");printf("谢谢");printf("网");return ERROR;}}}int writefile(int a,char*st){FILE*fp;fp=fopen("an_slr.txt","a");{fprintf(fp,"%s",st); /*若a==-1则为添加的注释*/}else if(a==-2){getdate(&today);gettime(&now);fprintf(fp,"\n测试日期:%d-%d-%d",today.da_year,today.da_mon,today.da_day);测试时间:%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec); fprintf(fp,"}else if(a>=0)fprintf(fp,"\n step:%02d,%s",a,st);writeok=1;fclose(fp);}return writeok;}int writeerror(char a,char*st) /*错误类型文件*/{FILE*fpp;fpp=fopen("an_slr.txt","a");if(fpp==0){printf("\nwrite error!!");writeok=0;}else{if(a=='0')fprintf(fpp,"%s",st); /*若a=='0' 则为添加的注释*/else fprintf(fpp,"%s\'%c\'(位置:%d)",st,a,ip+1);writeok=1;fclose(fpp);}return writeok;}/*^^^^^^^^^^^^^^^^^^^^^^*/main0(){int an,flag=1,action,lenr;char a,w[MAXINPUT];int len,s,ss,aa,ana;stack*st;char r[MAXSH][MAXSHL];/*初始化产生式*/strcpy(r[0],"S->E");strcpy(r[1],"E->E+T");strcpy(r[2],"E->T");strcpy(r[3],"T->T*F");strcpy(r[4],"T->F");strcpy(r[5],"F->(E)");strcpy(r[6],"F->i");clrscr();printf("\nplease input analyse string:\n");gets(w);len=strlen(w);w[len]='#';w[len+1]='\0';push(st,48); /*(int)0 进栈*/writefile(-1,"\n------------------------SLR(1)词法分析器-------------------------"); writefile(-1,"\n计本003 安完成于2003.01.1214:04"); writefile(-1,"\n谢谢");writefile(-1,"网");writefile(-1,"\n 以下为串");writefile(-1,w);writefile(-1,"('#'为系统添加)的分析结果:");writefile(-2,"");do{s=gettop(st);aa=(int)w[ip];action=analys(s,aa);if(action==MOVEIN){ss=48+act;push(st,aa);push(st,ss); /*if ss=4int=52*/ip++;}else if(action==GUIYUE){lenr=strlen(r[act])-3;for(an=0;an<=2*lenr-1;an++)pop(st); /*#0 */s=gettop(st); /*s=0*/push(st,(int)r[act][0]);/*将产生式左端F 进栈*/ana=analys(s,(int)r[act][0])+48;if(ana>59)printf("\分析出错:ana>59!!!");push(st,ana);/*analys(s,aa)即为goto(s',aa)*/if((line+1)%20==0){printf("\nThis screen is full,press any key to continue!!!");getche();clrscr();}printf("step%02d: %s\n",line++,r[act]);writefile(line,r[act]);}else if(action==ACC){flag=0;right=1;}else if(action==ERROR){flag=0;right=0;}/*接受成功*/else{flag=0;right=0;}/* 出错*/}while(flag==1);if(right==1)printf("\nok,输入串%s 为可接受串!!",w);if(right==0)printf("\nsorry,输入串%s 分析出错!!",w);if(writeok==1){printf("\nAnWin soft have wrote a file an_slr.txt");if(right==1)writefile(-1,"\n最终结果:输入串为可接受串!");}}main() /*主函数*/{clrscr();delay_fun();logined();}六、测试报告-操作系统课程设计-银行家算法(流程图+源代码+设计报告)六、测试报告:(测试结果保存于系统生成的an.txt 文件中)以下为课本上的实例::-------------------------------------------------------------------------------------========================银行家算法测试结果=========================-------------------------------------------------------------------------------------T0 时刻可用资源(Available)A:3,B:3,C:2测试日期:2003-6-28请求分配时间:14:07:29经测试,可为该进程分配资源。

2015广工操作系统课程设计报告之磁盘调度(附java源代码)

2015广工操作系统课程设计报告之磁盘调度(附java源代码)

《操作系统》课程设计磁盘调度算法学 院 计算机学院 专 业 计算机科学与技术 学 号 姓 名指导教师孙为军日期2016年1月2日操作系统课程设计任务书说明:本表由指导教师填写,由系主任审核后下达给选题学生,装订在设计(论文)首页一、设计思想说明1.1 设计环境开发平台:eclipse Version: Luna Service Release 1 (4.4.1) Build id: 20140925-1800开发环境:Windows10 操作系统Java版本:java version “1.8.0_25”java<TM> SE Runtime Environment <build 1.8.0_25-b18>java HotSpot(TM) 64-Bit Server Vm <Build 25.25-b02,mixed mode>1.2 设计思想1.先到先服务算法(FCFS)这是一种比较简单的磁盘调度算法。

它根据进程请求访问磁盘的先后次序进行调度。

此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

2.最短寻道时间优先调度算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。

其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。

在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。

3.扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

《操作系统》课程设计说明书

《操作系统》课程设计说明书

河南城建学院《操作系统》课程设计说明书设计题目:UNIX/Linux文件系统分析专业:计算机科学与技术指导教师:邵国金耿永军陈红军班级:0614082学号:061408261姓名:贠炳森同组人:叶矿辉、陈宇计算机科学与工程系2011年1月7日前言在现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。

同时,学习计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。

如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。

例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。

但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。

本操作系统课程设计,是给同学提供一个集中实验的机会。

希望同学们通过该设计加深对所学习课程的理解。

本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C++。

我做的课程设计是:Linux/Unix文件系统分析。

在Linux系统下,使用与文件相关的系统调用实现对物理设备文件的读写,参照Linux系统源代码以及Grub 系统的源代码,对不同介质上的FAT格式文件系统进行分析。

要求在Linux环境下设计出C语言程序,实现以下功能:1)分析UNIX SysV/Linux系统引导记录的作用;2)分析UNIX SysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIX SysV/Linux文件系统内各部分的定位。

3)至少要实现对给定i节点文件的只读访问目录一.系统环境 (3)1.1硬件环境 (3)1.2软件环境 (3)二.设计目的及要求 (3)三.总体设计 (5)四.详细设计 (6)五.调试与测试 (6)六.设计中遇到的问题及解决方法 (6)七.Linux/Unix文件系统分析源程序清单 (7)7.1 头文件 (7)7.2 示例程序 (10)八.运行结果及分析 (16)8.1 linux文件系统读取 (16)8.2 UNIX文件系统读取 (18)九.心得体会 (19)十.参考文献 (20)Linux/Unix文件系统分析一.系统环境1.1硬件环境cpu为pentium4双线程技术,频率为2.8GHZ,内存为256MB。

计算机操作系统课程设计源代码《生产者---消费者问题源代码》

计算机操作系统课程设计源代码《生产者---消费者问题源代码》

《生产者---消费者问题源代码》#include<stdio.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#include<semaphore.h>#include<sys/types.h>#include<errno.h>#include<unistd.h>#include<signal.h>#include<time.h>#define NUM_THREADS_P 5 /*定义数据为生产者*/#define NUM_THREADS_C 5 /*定义数据为消费者*/#define MAX_BUFFER 20 /*定义数据为缓存区*/#define RUN_TIME 20 /*定义运行时间*/int buffer[MAX_BUFFER]; /*定义最大缓存区*/int produce_pointer=0,consume_pointer=0; /*定义指针*/sem_t producer_semaphore,consumer_semaphore,buffer_mutex; /*定义信号量,互斥*/pthread_t threads_p[NUM_THREADS_P]; /*声明生产者线程*/pthread_t threads_c[NUM_THREADS_C]; /*声明消费者线程*/FILE* fd;void *producer_thread(void *tid); /*声明生产者线程*/void *consumer_thread(void *tid); /*声明消费者线程*/void showbuf(); /*声明showbuf方法*/void handler(){int i; /*定义i*/for(i=0;i<NUM_THREADS_P;i++)pthread_cancel(threads_p[i]);/*for循环,如果i<NUM_THREADS_P,则pthread_cancel(threads_p[i]);并且i++*/ for(i=0;i<NUM_THREADS_C;i++)pthread_cancel(threads_c[i]);/*for循环,如果i<NUM_THREADS_C,则pthread_cancel(threads_c[i]);并且i++*/}int main(){int i; /*定义i*/signal(SIGALRM,handler); /*定义信号量*/fd=fopen("output.txt","w"); /*打开一个文件用来保存结果*/sem_init(&producer_semaphore,0,MAX_BUFFER); /*放一个值给信号灯*/sem_init(&consumer_semaphore,0,0);sem_init(&buffer_mutex,0,1);for(i=0;i<MAX_BUFFER;i++)buffer[i]=0; /*引发缓冲*//*创建线程*/for(i=0;i<NUM_THREADS_P;i++)pthread_create(&threads_p[i],NULL,(void*)producer_thread,(void*)(i+1)); /*创建线程*/for(i=0;i<NUM_THREADS_C;i++)pthread_create(&threads_c[i],NULL,(void*)consumer_thread,(void *)(i+1));alarm(RUN_TIME);for(i=0;i<NUM_THREADS_P;i++)pthread_join(threads_p[i],NULL);/*等待线程退出*/for(i=0;i<NUM_THREADS_C;i++)pthread_join(threads_c[i],NULL);/*等待线程退出*/sem_destroy(&producer_semaphore);/*清除信号灯*/sem_destroy(&consumer_semaphore);/*清除信号灯*/sem_destroy(&buffer_mutex);/*清除缓存区*/fclose(fd); /*关闭文件*/return 0;}void *producer_thread(void *tid){pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 设置状态,PTHREAD_CANCEL_ENABLE是正常处理cancel信号*/ while(1){sem_wait(&producer_semaphore); /*等待,需要生存*/srand((int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一个或两个需要生产*/while((produce_pointer+1)%20==consume_pointer); /*指针位置*/sem_wait(&buffer_mutex); /*缓存区*/buffer[produce_pointer]=rand()%20+1; /*指针位置*/produce_pointer=(produce_pointer+1)%20; /*指针位置*//*判断*/if(produce_pointer==0){printf("生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,19,buffer[19]); /*输出生产者,指针,缓存区*/fprintf(fd,"生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,19,buffer[19]); /*输出生产者,指针,缓存区*/}else{printf("生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,produce_pointer-1,buffer[produce_pointer-1]);/*输出生产者,指针,缓存区*/fprintf(fd,"生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,produce_pointer-1,buffer[produce_pointer-1]);/*输出生产者,指针,缓存区*/}showbuf();sem_post(&buffer_mutex);sem_post(&consumer_semaphore); /*通知消费者缓冲区不是空的*/srand((int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待几秒钟,然后继续生产*/}return ((void*)0);}void *consumer_thread(void *tid){/*可以被其他线程使用*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 设置状态,PTHREAD_CANCEL_ENABLE是忽略cancel信号*/while(1){sem_wait(&consumer_semaphore); /*通知消费者消费*/srand((int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一个或两个来消费*/sem_wait(&buffer_mutex);printf("消费者:%d 指针指向:%2d 消费产品号:%2d\n",(int)tid,consume_pointer,buffer[consume_pointer]);/*输出消费者,消费者指针,缓存区*/fprintf(fd,"消费者:%d 指针指向:%2d 消费产品号:%2d\n",(int)tid,consume_pointer,buffer[consume_pointer]);/*输出消费者,消费者指针,缓存区*/buffer[consume_pointer]=0; /*消费者指针指向0*/consume_pointer=(consume_pointer+1)%20;showbuf();sem_post(&buffer_mutex);sem_post(&producer_semaphore); /*通知生产者缓冲区不是空的*/srand((int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待几秒钟,然后继续消费*/}return ((void*)0);}/*查看缓冲区内容*/void showbuf(){int i; /*定义i*/printf("buffer:"); /*输出缓存区*/fprintf(fd,"buffer:"); /*输出缓存区*/for(i=0;i<MAX_BUFFER;i++){printf("%2d ",buffer[i]);/*输出缓存区i*/fprintf(fd,"%2d ",buffer[i]); /*输出缓存区i*/ }printf("\n\n"); /*换行*/fprintf(fd,"\n\n"); /*换行*/}。

操作系统课程设计文档及代码

操作系统课程设计文档及代码

1 设计目的与内容1.1 设计目的通过课程设计, 加深对操作系统对程序执行的理解,掌握操作系统的多程序运行原理,能模拟操作系统设计相应的进程调度算法,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。

1.2 设计内容1、设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。

2、建立进程就绪队列。

对两种不同算法编制入链子程序。

3、编制两种进程调度算法:1)可强占的优先进程调度;2)循环时间片轮转调度4、设计操作系统运行的指令。

2 设计说明2.1 需求分析设计虚拟内核实现进程的调度,实现多道程序的调度。

设计调度算法计算各个进程的优先权限来确定进程执行的次序。

进程调度程序选择一个就绪状态的进程,使之在处理器上运行。

进程的调度采用最高优先数优先的调度算法和先来先服务调度算法相结合的算法,并且采用动态优先数策略,选择进程占用处理器后该进程仅能使用一个时间片,运行完后优先数减1。

2.2 设计思路本程序用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。

为了便于处理,程序中的某进程运行时间以时间片为单位计算。

各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

在优先数算法中,优先数的值为31与运行时间的差值。

进程每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。

设计程序指令,MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。

SUB n //从累加器A的值减去整数n,结果送到累加器A。

MUL n //从累加器A的值乘以整数n,结果送到累加器A。

操作系统内核课程设计

操作系统内核课程设计

操作系统内核课程设计一、课程目标知识目标:1. 让学生理解操作系统内核的基本概念、结构和功能,掌握操作系统的进程管理、内存管理、文件系统等核心模块的工作原理。

2. 使学生掌握操作系统内核编程的基本方法,学会使用相关工具和接口进行系统调用和驱动程序开发。

3. 帮助学生了解操作系统安全性、稳定性的重要性,掌握基本的系统调试和优化技巧。

技能目标:1. 培养学生具备分析操作系统内核源代码的能力,能够阅读和理解常见的操作系统内核模块。

2. 培养学生具备设计、编写和调试简单的操作系统内核模块的能力,能够实现特定功能并进行性能优化。

3. 提高学生运用所学知识解决实际问题的能力,能够针对具体场景提出合理的操作系统内核设计方案。

情感态度价值观目标:1. 培养学生热爱操作系统内核技术,树立积极探索、持续学习的信念。

2. 培养学生的团队协作意识,学会与他人共同分析问题、解决问题,形成良好的沟通与协作能力。

3. 引导学生关注操作系统内核技术的发展趋势,认识到技术进步对社会发展的重要性,树立社会责任感。

本课程针对高年级学生,课程性质为专业核心课。

在教学过程中,需充分考虑学生的认知特点,注重理论与实践相结合,引导学生主动探究、动手实践。

通过本课程的学习,期望学生能够掌握操作系统内核的基本知识和技能,为未来从事相关领域的研究和工作打下坚实基础。

二、教学内容本课程教学内容围绕以下三个方面展开:1. 操作系统内核基础理论- 深入讲解操作系统内核的基本概念、结构、功能和设计原理。

- 分析进程管理、内存管理、文件系统、设备管理等核心模块的工作机制。

2. 操作系统内核编程实践- 介绍操作系统内核编程的基本方法,包括系统调用、驱动程序开发等。

- 结合教材示例,指导学生阅读和分析操作系统内核源代码。

教学大纲安排:1)第1-4周:操作系统内核基础理论2)第5-8周:进程管理、内存管理编程实践3)第9-12周:文件系统、设备管理编程实践3. 操作系统内核优化与调试- 讲解操作系统内核安全性、稳定性方面的知识,分析常见漏洞和防护措施。

操作系统课程设计报告

操作系统课程设计报告

实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。

能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。

如果不能计算出相应的物理地址,说明原因。

⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。

能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。

⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。

能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。

⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。

能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。

⑸段式存储管理中逻辑地址到物理地址的转换。

能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。

⑹段页式存储管理中逻辑地址到物理地址的转换。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计课程名称________操作系统___ ____题目名称_多用户多级目录文件系统的实现_ 学生学院________计算机学院____________ 专业班级______ _________学号________ ___________ 学生_________ _____________指导教师__________林穗______________ 2011年1月18日工业大学课程设计任务书题目名称多用户多级目录文件系统的实现学生学院计算机学院专业班级08软件工程一班姓名学号一、课程设计的容本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统部功能和实现过程的理解。

二、课程设计的要求与数据1.在存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2.文件物理结构可采用显式或其他方法。

3.磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式分配方式,则可以将位示图合并到FAT中。

4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。

5.设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建:create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout6.系统必须可实际演示,选用程序设计语言:C++、C等。

三、课程设计应完成的工作1.充分理解设计的任务,完成设计的基本要求。

然后根据自己的基础和能力选择不同难度的算法和实现方式,以取得更高的分数。

2. 独立独立完成系统的分析、设计、编码、测试工作。

3.完成设计报告的撰写。

4.以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计报告”的书面和电子两种版本。

四、课程设计进程安排五、应收集的资料及主要参考文献[1]计算机操作系统,汤小丹等,电子科技大学[2]操作系统实验指导书,傅秀芬,工业大学(自编)[3] 计算机操作系统教程( 第二版),尧学、史美林,清华大学[4] 现代操作系统,A.S.Tanenbaum 著,向群等译机械工业发出任务书日期:2010年12月22日指导教师签名:林穗计划完成日期:2011年1月21日基层教学单位责任人签章:滕少华目录i.设计目的…………………………………………………………………ii.开发工具与环境…………………………………………………………iii.设计思想…………………………………………………………………iv.系统结构说明……………………………………………………………v.数据结构说明……………………………………………………………vi.各模块的算法流程图……………………………………………………1、程序总体源流程图……………………………………………………2、主要模块的算法流程图………………………………………………3、函数声明………………………………………………………………vii.程序运行及清单…………………………………………………………1、用户管理操作界面……………………………………………………2、文件管理操作界面……………………………………………………3、主要核心源代码………………………………………………………viii.操作说明书………………………………………………………………1、用户管理使用手册…………………………………………………2、文件操作管理使用手册……………………………………………ix.体会和建议………………………………………………………………………i.设计目的本课程设计要求设计一个模拟的多用户多级目录的文件系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统部功能和实现过程的理解。

ii.开发工具与环境a)程序设计语言:C语言b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0简化版d)运行平台:PC机,WindowsXPiii.设计思想课程设计采用Microsoft Visual C++ 6.0简化版作为开发工具,参照了windows资源管理器的结构,模拟文件管理的工作过程,通过创建一棵多叉树,及对这棵多叉树的操作,建立了一个树型文件系统,实现了文件和文件夹的创建,打开,读写,删除,关闭,复制,粘贴,查看,属性设置等十来个功能。

操作界面简单明了,操作方便。

iv.系统结构说明模拟文件管理系统可以自行设置多个用户进行管理操作,当选择已有用户时便可进入其文件管理菜单进行相应的操作(有界面提示功能),当进入系统已建立的某个用户时,可以创建用户自己的文件夹或文件,当flag=0时为创建文件,flag=1时创建文件夹(这里设置了标志位)。

文件除了名称和打开标志外,还可对他们的访问权限、文件类型和文件长度进行设置(长度设置主要在写入文件时会用到);而文件夹则可以设置访问权限等,打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的链表中包括文件夹名称及其地址等;对文件的管理包含复制、打开、关闭、写入、读出、粘贴、新建文件(夹)、删除文件(夹)和显示文件(夹)等等,为方便操作还设置了各功能操作(如进入下一级、返回上一级、返回初始菜单、直接退出等等)。

下面的系统结构说明图示:其中P表示parent指针,C表示child指针,N表示next指针v.数据结构说明该模拟文件管理系统的文件目录检索采用简单的线性搜索,系统所采用的数据结构:typedef struct list LIST;struct list{char listname[10];int type;int length;int protect;int flag;char *content;struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10];LIST *list;struct usd *next;};vi.各模块的算法流程图1.程序总体流程图2.主要模块的算法流程图1)创建用户模块:2)删除用户3)创建文件(夹)4)删除文件夹5)复制文件3.函数声明void displayusermenu();///用户管理界面菜单void time();///系统时间void displayfilemenu();///文件管理界面菜单void creatuser();///新建用户void deleteuser();///删除用户void displayuser();///显示用户void userhelp();///用户管理帮助void filehelp();///文件管理帮助void selectuser();///选择用户void displaylist();///显示文件或者文件夹void creatfile(LIST *qq,int flag);///创建文件(夹)void deletefile(LIST *qq,int flag);///删除文件(夹)void openfile();///打开文件void readfile(); ///读取文件void writefile(); ///写入文件void closefile();///关闭文件void next();///下一层文件夹void back();//上一层文件夹void copyfile();//复制文件void pastedfile();///粘贴文件void quit();///直接退出系统vii.程序运行及清单系统界面简洁美观实用,用户无须输入过长指令就可以完成操作。

本系统还附带操作指南,用户如有疑问可查看指南说明。

虽不如可视化易操作,但也不难。

1、用户管理操作1)程序登陆界面2)程序开始界面(即用户管理界面)3)新建用户4)列出用户5)删除用户6)系统日期时间7)帮助文档8)退出系统9)选择用户输入用户名(若系统无此用户会有提示)按回车后即进入文件操作界面。

2、对文件管理操作1)进入用户后对文件操作初始界面2)新建文件3)新建文件夹4)显示当前路径文件(夹)5)删除文件文件存在时6)删除文件夹文件夹存在时7)打开文件文件存在时8)读出文件文件需要先置于打开状态,方可读取由于没有输入容所以文件容为空。

9)写入文件10)读出刚才写入的容11)关闭文件12)复制文件(先将刚才关闭的文件aa1打开再复制)如果输入的文件名不存在该用户中时会有提示信息3、主要核心源代码(见电子版)#include <stdio.h>#include <math.h>#include <malloc.h>#include <string.h>#include <conio.h>#include <time.h>#include "stdlib.h"#define NULL 0#define get(type) (type *)malloc(sizeof(type)) //分配空间typedef struct list LIST;struct list{char listname[10]; // 文件名长度int type;int length; // 文件长度int protect; // 保护模式,0为只读,1为可读写int flag; // 标志,为0时创建文件夹,为1时创建文件char *content;struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10]; // 用户名长度LIST *list;struct usd *next;};// 函数声明void displayusermenu(); // 用户管理界面菜单void login(); // 系统登陆界面void time(); // 系统时间void displayfilemenu(); // 文件管理界面菜单void creatuser(); // 新建用户void deleteuser(); // 删除用户void displayuser(); // 显示用户void userhelp(); // 用户管理帮助void filehelp(); // 文件管理帮助void selectuser(); // 选择用户void displaylist(); // 显示文件或者文件夹void creatfile(LIST *qq,int flag);// 创建文件(夹) void deletefile(LIST *qq,int flag);// 删除文件(夹)void openfile(); // 打开文件void readfile(); // 读取文件void writefile(); // 写入文件void closefile(); // 关闭文件void next(); // 下一层文件夹void back(); // 上一层文件夹void copyfile(); // 复制文件void pastedfile(); // 粘贴文件void quit(); // 直接退出系统USD *user=NULL,*currentuser=NULL;LIST *list=NULL,*currentlist=NULL,*copylist=NULL;void displayusermenu() // 显示用户菜单{system("cls"); // 清屏int button;printf("\n\n\t\t\t欢迎使用多用户多级目录文件系统\n\n"); printf("\t\t计算机学院\t\t软件工程1班\n\n");printf("\t\t \t\t \n\n\n");printf("\t\t1、新建用户\n");printf("\t\t2、删除用户\n");printf("\t\t3、选择用户\n");printf("\t\t4、列出用户\n");printf("\t\t5、系统时间\n");printf("\t\t6、帮助文档\n");printf("\t\t7、退出系统\n\n");printf("\t\t请按功能选择操作:");scanf("%d",&button);switch(button){case 1:creatuser();break; // 创建新用户case 2:deleteuser();break; // 删除用户case 3:selectuser();displayfilemenu();break; // 选择一个用户case 4:displayuser(); // 显示用户getchar();getchar();displayusermenu();break;case 5:system("cls"); //系统时间显示time();displayusermenu();break;case 6:userhelp(); // 帮助getch();displayusermenu();break;case 7:system("cls"); // 退出printf("\n\n\n\t\t\t\t欢迎再次使用!!\n\n");getch();exit(0);break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayusermenu();break; // 输入非上述数字重新输入}}void displayfilemenu() // 显示文件管理操作菜单{system("cls"); // 清屏int choice;LIST *p=currentlist;printf("\n\t\t [%s]你好,欢迎进入文件管理系统\n",currentuser->username);//提示信息printf("\n 当前的文件路径:");// 接入目录地址do{printf("<%s",p->listname);p=p->parent;}while(p!=NULL);printf("\t\t[格式:子目录<--根目录]\n\n");printf(" 功能选择\n\n");//菜单printf("\t\t1、新建文件\t\t\t 9、复制文件\n");printf("\t\t2、删除文件\t\t\t10、粘贴文件\n");printf("\t\t3、新建文件夹\t\t\t11、显示当前路径文件(夹)\n");printf("\t\t4、删除文件夹\t\t\t12、进入下一级文件夹\n");printf("\t\t5、打开文件\t\t\t13、返回上一级文件夹\n");printf("\t\t6、读出文件\t\t\t14、返回用户管理菜单\n");printf("\t\t7、写入文件\t\t\t15、帮助与支持\n");printf("\t\t8、关闭文件\t\t\t16、直接退出系统\n\n");printf("\n\n");printf("\t\t\t按功能选择选择相应的操作(输入相关数字): ");scanf("%d",&choice);printf("\n");system("cls");switch(choice)//switch语句{case 1:creatfile(currentlist,0);break; // 创建文件case 2:deletefile(currentlist,0);break; // 删除文件case 3:creatfile(currentlist,1);break; // 创建文件夹case 4:deletefile(currentlist,1);break; // 删除文件夹case 5:openfile();break; // 打开文件case 6:readfile();displayfilemenu();break; // 读出文件case 7:writefile();displayfilemenu();break; // 写入文件case 8:closefile();break; // 关闭文件case 9:copyfile();break; // 复制文件case 10:pastedfile();break; // 粘贴文件case 11:displaylist(); // 显示文件(夹)getch();displayfilemenu();break;case 12:next();break; // 进入下一级文件夹case 13:back();break; // 返回上一级文件夹case 14:displayusermenu();break; // 退出,返回上用户管理菜单case 15:filehelp();displayfilemenu();break;case 16:quit();break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayfilemenu();break; // 非法输入,返回文件管理菜单重新输入}}void login(){char username[20];char password[20];printf("\n\n\n\n");printf("\t\t\t系统登陆:(用户密码均为admin)\n\n");printf("\t\t\t请输入用户名:");scanf("%s",username);printf("\t\t\t请输入密码:");scanf("%s",password);if(strcmp(username,"admin")||strcmp(password,"admin")){printf("\n\t\t用户名或密码错误,请重新输入!\n");getch();system("cls");login();}}void time() // 显示系统时间日期{time_t now; // 调用系统日期时间time(&now);printf("\n\n \t\t\t系统当前日期时间\n\n");printf("\t\t\t %s",asctime(localtime(&now)));//显示系统详细时间printf("\n\n\n");getch();}void creatuser() // 创建用户{int i;char s;USD *p,*q=user;system("cls");p=get(USD);for(i=1;q!=NULL;i++)q=q->next; // i指示当前用户个数q=user;printf("\n\t\t\t\t[创建一个新用户]\n");printf("\n\t\t\t\t请输入NO.%d个用户名: ",i);scanf("%s",p->username); //输入新用户的名字LIST *l=list;l=get(LIST);strcpy(l->listname,p->username);l->next=NULL;l->type=1;l->parent=NULL;l->child=NULL;p->list=l;p->next=NULL;if(user==NULL){user=p; // 若user为空,则把P复给user}else // 若user不为空,则以有旧用户存在{while(q->next!=NULL){ // 寻找最后一个用户if(strcmp(p->username,q->username)==0){ // 比较,看系统是否已经存在该用户printf("\n\tthe user has exit ! try again !\n\n"); // 提示出错信息getchar();getchar();system("cls");displayusermenu();}q=q->next;}if(strcmp(p->username,q->username)==0){///检查提示重名并提示信息printf("\n\t\t\t该用户已经存在!无法创建该用户!\n\n");getchar();getchar();system("cls");displayusermenu();}q->next=p; //继续寻找下一个字符}printf("\n\t\t\t\t是否要再创建一个用户?(Y/N):"); //输入下一个用户scanf("%s",&s);switch(s){case 'y':creatuser();break;case 'Y':creatuser();break;case 'n':displayusermenu();break;case 'N':displayusermenu();break;default :displayusermenu();break;}}void deleteuser() //删除用户{char n[10];USD *p=user,*pre=NULL;displayuser();if(!p){printf("\n\t\t\t\t系统无用户可删除!\n"); //P为空,报错,必须先创建一个用户getchar();getchar();system("cls");displayusermenu();}printf("\n\n\t\t\t\t请输入要删除的用户名:");scanf("%s",n);while(p!=NULL){if(strcmp(p->username,n)==0) //寻找所要删除的用户{if(p==user){user=user->next; //若是第一个用户,则释放P }else{pre->next=p->next;}free(p);printf("\n\n\n\t\t\t\t 已经成功删除用户[%s]!!! ",n);break;}else{pre=p;p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t找不到该用户!请确认该用户是否存在!\n");}getchar();getchar();system("cls"); displayusermenu();}void selectuser() //选择用户{char n[10];USD *p=user;displayuser();if(!p){printf("\n\t\t\t该用户不存在!请确认用户名是否正确!!!"); //没有用户getchar();getchar();system("cls");displayusermenu();}printf("\n\t\t\t\t[选择一个用户]");printf("\n\n\t\t\t\t请输入用户名:");scanf("%s",n); //输入用户名while(p!=NULL){if(strcmp(p->username,n)==0) //逐个比较寻找用户{currentuser=p; //找到对应用户,则把currentuser指向该用户currentlist=p->list;printf("%s\n",currentlist->listname);return;}else{p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t\t该用户不存在!!!");getchar();system("cls");displayusermenu();}}void creatfile(LIST *qq,int flag) //创建文件(夹){LIST *temp;LIST *p=qq->child;LIST *q;temp=get(LIST);loop:q=qq->child;if(flag==0){printf("\n\t\t\t\t[创建一个新文件]\n");printf("\n\t\t\t\t请输入新建文件名: "); //输入文件名}else{printf("\n\t\t\t\t[创建一个新文件夹]\n");printf("\n\t\t\t\t请输入新建文件夹名: "); //输入文件名}scanf("%s",temp->listname);while(q!=NULL){if(strcmp(temp->listname,q->listname)==0){printf("\n\t\t\t相同路径下有重名文件!请重新输入!");goto loop;}q=q->next;}temp->content=NULL;printf("\n\t\t文件属性: 0、只读Read\t\t1、读和写Read&Write"); //设置保护模式printf("\n\n\t\t\t请根据提示选择保护模式(0/1)?: ");scanf("%d",&temp->protect);if(temp->protect!=0&&temp->protect!=1){ printf("\n\n\t\t\t你的选择有误!请重新输入(0/1)?: ");scanf("%d",&temp->protect);}if(flag==0){printf("\n\t\t\t\t请输入该文件的长度: "); //设置文件长度,供写入文件时会用到scanf("%d",&temp->length);}if(flag==0)temp->type=0; //0为文件else temp->type=1;temp->flag=0; //文件默认为关闭状态,以后需要时再打开temp->child=NULL;temp->next=NULL;temp->parent=currentlist;if(p==NULL){qq->child=temp;}else{while(p->next!=NULL){p=p->next;}p->next=temp;}getchar();displayfilemenu();}void deletefile(LIST *qq,int flag) //删除文件(夹) {char n[10];LIST *p=qq->child;LIST *pre=NULL;if(flag==0){printf("\n\t\t\t\t[删除一个文件]\n");printf("\n\t\t\t\t请输入要删除的文件名: ");}else{printf("\n\t\t\t\t[删除文件夹]\n");printf("\n\t\t\t\t请输入要删除的文件夹名: ");}scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);free(p);}break;}else if((strcmp(p->listname,n)==0)&&(p->type==1)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);free(p);}break;}else{pre=p;p=p->next;}}if(p==NULL&&flag==0) //该文件不存在printf("\n\n\t\t\t\t找不到该文件!");else if(p==NULL&&flag==1) printf("\n\n\t\t\t\t找不到该文件夹!\n");getchar(); //用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中)getchar();displayfilemenu();}void openfile() ////打开文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[打开一个文件]\n");printf("\n\t\t\t\t请输入要打开的文件名: ");//输入文件名scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0))//比较文件以寻找要打开的文件{p->flag=1;printf("\n\t\t\t\t文件%s成功打开!!!\n",n);break;}elseif((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1)) {printf("\n\t\t\t\t文件%s打开已经!!!\n",n);break;}p=p->next;}if(p==NULL){printf("\n\n\t\t\t\t找不到该文件!\n");}getchar();getchar();displayfilemenu();}void readfile() //读出文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[读取一个文件]\n");printf("\n\n\t\t\t\t请输入要读的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//{printf("\n\t\t\t文件%s容是:%s",p->listname,p->content);getchar();getchar();system("cls");return;}p=p->next;}printf("\n\n\t\t读文件失败,请确认该文件是否已经打开或文件是否存在!\n");getchar();getchar();}void writefile() //写入文件{char n[10],*temp;LIST *p=currentlist->child;printf("\n\t\t\t\t[写入文件]\n");printf("\n\t\t\t\t请输入要写的文件名: ");scanf("%s",n);while(p!=NULL)if((strcmp(p->listname,n)==0)&&(p->type==0)){if(p->flag==0){printf("\n\t\t\t文件未打开,无法写入!请将文件置打开状态!!!\n");getchar();getchar();system("cls");}else if(p->protect==0){printf("\n\n\t\t\t操作受限!该文件不能写!!!\n"); //该文件限制读写getchar();system("cls");return;}else{temp=(char *)malloc(sizeof(char)*p->length);printf("\n\n\t\t\t\t请输入文件容(length<=%d):\n\n\t",p->length);scanf("%s",temp);p->content=temp;getchar();system("cls");}return;}p=p->next;}printf("\n\n\t\t\t该文件不存在!获取失败!!!\n");//提示getchar();getchar();}void closefile() //关闭文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[关闭一个文件]\n");printf("\n\t\t\t\t请输入要关闭的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//寻找需要文件。

相关文档
最新文档