进程控制系统模拟-文档
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2014年秋季学期
操作系统原理课程设计
题 目: 进程控制系统模拟 专业班级: 计算机2班 姓 名: 学 号: 指导教师: 成 绩: _______________
操作系统原理课程设计是为了让我们能对操作系统原理有更进一步的了解所开设的实践课程。这就要求我们在对课本主要内容熟练掌握的前提下,还能够运用这些内容来解决实际问题。
本次课设题目为进程控制系统模拟。进程的控制过程包括:创建进程、判断进程、换出进程、终止进程、杀死进程等,这些控制和管理功能是由操作系统中的原语来实现的。原语是在管态下执行、完成系统特定功能的程序段,而用于进程控制的原语包括:创建原语、撤销原语、阻塞原语、唤醒原语、挂起原语和激活原语等。系统对进程的控制如不使用原语,就会造成其状态的不确定性,从而实现不了进程控制的功能。本课设将实现用一个fork()函数实现进程的创建,查看运行,再利用一个exec( ) 函数实现进程之间的替换,用一个wait ()函数调整进程的运行顺序,直到杀死进程退出程序。主要算法采用了先来先服务,这样做的优点是进入队列的顺序决定优先级。
课程设计可以提高我们的实践动手能力,能让我们把课本上的知识真正在实际应用中得到实现,进而把它变成自己的东西,达到学以致用的效果。同时,还可以加深对理论知识的印象。这也可以为我们以后的工作奠定良好的基础。
关键字: 进程控制 原语 进程创建 进程撤销
《操作系统原理》是计算机类专业的核心课程,也是其他诸多类专业的重要选修课,开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础,同时对于自己逻辑思维培养和程序设计思想体系的建立有着重要的影响。但是对于《操作系统原理》这门课仅仅通过课堂教学或自学获取理论知识是远远不够的,还必须加强实践,亲自上机输入、编辑、检查、修改、调试和运行各种典型算法。在大学学习时,知识是通过一门门独立的课程传授的,而实际问题之能够顺利地得到解决,不但需要多方面的知识,而且还需要善于对这些知识综合地加以运用。这次课设正是给我们了一次自己实践的机会。
每个进程用一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU 时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。
由于多道程序设计的操作系统都建立在进程的基础上,操作系统中引进进程的概念,理论角度讲是对正在运行的程序活动规律的抽象;从实现角度讲,则是一种数据结构,目的在于清楚地刻画系统的动态规律,有效管理计算机系统中程序的运行。
目录
摘 要.......................................................................................................................................... - 2 - 前 言.......................................................................................................................................... - 3 - 一、设计思想 . ............................................................................................................................. - 5 -
1.1基本原理 . ...................................................................................................................... - 5 - 1.2设计目的及要求 . .......................................................................................................... - 5 - 1.3进程状态关系 . ................................................................................................................... 6 1.4进程控制 . ........................................................................................................................... 6 1.5总体设计思路 . ................................................................................................................... 7 二、各模块的伪码算法 . ............................................................................................................. - 8 -
2.1 进程控制块 . ................................................................................................................. - 8 - 2.2 新建进程 . ..................................................................................................................... - 8 - 2.3 查看运行中的进程 . ..................................................................................................... - 8 - 2.4 撤销进程 . .......................................................................................................................... 9 三、测试结果分析 . ................................................................................................................... - 11 -
3.1开始界面演示 . ............................................................................................................ - 11 - 3.2 新建功能界面 . ........................................................................................................... - 11 - 3.3进程的查看演示 . ............................................................................................................. 12 3.4进程的调度情况 . ........................................................................................................ - 12 - 3.5退出系统 . .................................................................................................................... - 13 - 设 计 总 结 . ............................................................................................................................. - 14 - 参 考 文 献 . ............................................................................................................................. - 15 - 致 谢........................................................................................................................................ - 16 - 附录(部分程序源代码) . ........................................................................................................... - 17 -
一、设计思想
1.1基本原理
进程:进程是具有独立功能的可并发执行的程序在一个数据集合上的运行过程,在系统运行过程中是不断产生和消亡的。
中断:中断是指处理机对系统中或系统外发生的异步事件的响应。 进程管理:主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
内核在引导并完成了基本的初始化以后,就有了系统的第一个进程,即初始化进程,实际上是内核线程。除此之外所有的其它进程和线程都是由这个原始的进程或其子孙进程所创建。通过用主函数建立一个主菜单,然后再编写各个子函数分别实现主函数的功能,从而达到实现创建进程,查看进程,换出进程,杀死进程,结束进程等功能,在整个过程中主要用到了公共参数和私有参数以及函数调用等技术。 1.2设计目的及要求
通过该题目的设计过程,可以初步掌握进程控制系统的原理、软件开发方法并提高解决实际问题的能力。也能提高同学们的实践动手能力,在实践过程中加深理解和熟练掌握课本中所学的各种操作,学会如何把所学的知识用于解决实际问题,以达到学以致用的效果。了解Windows XP 的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。利用Windows SDK(System Development Kit )提供的API (应用程序接口)编程模拟实现进程控制系统,要求用fork( ) 创建一个进程,再调用exec( ) 用新的程序替换该子进程的内容,利用wait( )来控制进程执行顺序。
核心要求用fork( ) 创建一个进程,再调用exec( ) 用新的程序替换该子进程的内容,利用wait( )来控制进程执行顺序。现设计为以下内容:
1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数
据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。 3、设计中遇到的问题,设计的心得体会。 1.3进程状态之间的关系
进程的三个状态之间的转换如图1-3所示:
图1-3 进程的三种基本状态及其转换
1.4 进程控制
建立四个函数模拟进程创建、撤销、阻塞和唤醒四个原语。 ①进程创建fork () 进程创建的主要工作是: 第一步,申请空白进程控制块; 第二步,初始化进程控制块; 第三步,将进程链入就绪队列。 ②进程撤销destory () 进程撤销的主要工作是:
第一步,回收进程所占内存资源; 第二步,回收进程控制块;
第三步,在屏幕上显示进程执行结果,进程撤销 ③进程阻塞block () 进程阻塞的主要工作是:
第一步,保存运行进程的CPU 现场; 第二步,修改进程状态;
第三步,将进程链入对应的阻塞队列,然后转向进程调度。 ④进程的唤醒
进程唤醒的主要工作是将进程由阻塞队列中摘下,修改进程状态为就绪,然后链入就绪队列。 1.5 总体设计思路
进程的总体设计主要模块如图1-5所示:
图1-5 总体设计模块
二、各模块的伪码算法
2.1 进程控制块
定义一个ProcessType 为进程控制块,内设置进程标示符pid 、进程的优先级、进程的大小以及进程的信息。还包括struct ProcessType Ready[20];//就绪数组。
struct ProcessType Hung[20]; //挂起数组; struct ProcessType Cpu;
//运行进程。
int Number1=0,Number2=0,First=0;
//Number1是就绪队列中的进程的个数;
//Number2是挂起队列中的进程个数; //First是判断是否是第一次输入进程。
2.2新建进程
通过fork ()函数新建个进程,并设置就绪队列的最大长度为10;并包括
2.3查看运行中的进程
新建一个RUN 函数用于查看正在运行的状态,函数如下: Run() 输出结果;
将优先级高的进程调入CPU 执行 定义数组;
就绪数组第一个数; for(i=0;i
if(strcmp(p,Ready[i].Priority)
把Ready[i].Priority所指向的由NULL 结束的字符串复制到p 所指的数组中。 for(i=0;i
for(i;i
用一个skill ()函数来实现进程的销毁,详细设计如下: Void(); 定义数组; 显示输出结果; for(i=0;i
for(i=0;i
for(i;i
for(i;i
else continue;
if(strcmp(p,Cpu.Pid)==0) 重新赋值;
for(i=0;i
三、测试结果分析
3.1开始界面演示
开始界面如图3-1所示:
图3-1
3.2 新建功能界面
图3-2
3.3进程的查看演示
图3-3
3.4进程的调度情况
图3-4
3.5退出系统
图3-5
设 计 总 结
通过这次课程设计,增强了自己C++的编程能力,也加深了对操作系统原理这门课程中进程控制管理模块的理解。但还是有些不足之处,例如未能很好的实现进程的协调控制,界面不美观,若能通过图形化界面显示则效果会更好。我争取在以后的学习过程中以这次课程设计的不足为经验,进一步强化学习自己的编程能力和对问题的分析和解决能力。两个星期程序设计课程,虽然时间有点短,但我也收获不少,这次试验,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。
在设计过程中的思考和讨论,使我对现有知识能够运用计算机来解决现实生活中的实际问题确立了信心,对模块化程序设计思想有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。在这样一次又一次的砺炼中,我得到的不仅仅是知识,更多的是自身能力的提高。
经过这次课设我学到了很多。这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一次自我验证。通过此次课程设计加深理解了什么是进程控制,熟悉了Windows 7支持的进程的控制方式。练习并掌握了Windows SDK(System Development Kit)提供的API 编辑器来编译C 程序,学会了利用API 编译、调试C 程序。
更重要的是通过此次课程设计使我懂得了三思而后行,学到了严谨的学习态度、永不放弃的精神,也增加了去面对更大挑战的信心和勇气,同时也培养了把学到的知识用于解决实际问题,培养了我的独立动手能力。
参 考 文 献
[1] 汤子瀛, 哲凤屏. 《计算机操作系统》. 西安电子科技大学学出版社. [2] 王清,李光明. 《计算机操作系统》. 冶金工业出版社. [3] 孙钟秀等. 《操作系统教程》. 高等教育出版社
[4] 曾明. 《Linux 操作系统应用教程》. 陕西科学技术出版社. [5] 张丽芬, 刘利雄. 《操作系统实验教程》. 清华大学出版社. [6] 孟静. 《操作系统教程--原理和实例分析》. 高等教育出版社 [7] 周长林. 《计算机操作系统教程》. 高等教育出版社 [8] 张尧学. 《计算机操作系统教程》. 清华大学出版社 [9] 任满杰. 《操作系统原理实用教程》. 电子工业出版社
致 谢
经过近两周的上机实践,本次操作系统原理的课程设计圆满完成了,这次课程设计培养了我全面思考问题的能力,从而加快了解决问题的速度、提高了的工作效率,以及锻炼了在短时间内解决问题的顽强意志。
在编写程序的过程中,我得到了庞淑侠老师、王旭阳老师、李晓旭老师的的耐心指导,在老师的指导下,我的能力得到了提高,同时养成了科学、严谨的作风和习惯,为此我要诚恳的感谢三位老师。同时还要感谢孙源同学在一些问题上对我的指点以及牛长平同学在一些问题上跟我的共同探讨。,没他们的帮助可能有很多问题我个人不能进行很好的解决。在此我对他们所有人的帮助表示衷心的感谢。
另外通过本次课程设计,我深刻体会到在遇到问题时要沉着冷静,不要盲目去做,须知“磨刀不误砍柴工”。首先对问题进行全面的分析,勾勒出大致思路,然后根据思路决定解决问题的大致方向,制定相应的解决方案, 进而逐步解决问题。
附录(部分程序源代码)
#include #include #include #include struct ProcessType {
char Pid[10]; char Size[10]; };
struct ProcessType Ready[20];//就绪数组。 struct ProcessType Hung[20]; //挂起数组; struct ProcessType Cpu; **/
//新建进程的函数; void fork() {
if(Number1>20) {
printf("\n就绪进程已满, 请先删除或挂起进程\n"); } else {
if(First==0) {
printf("\n");
printf("\n这是你第一次输入进程信息, 它将直接调入CPU 运行!\n"); printf("\n请输入新进程的Pid\n"); scanf("%s",&Cpu.Pid);
printf("\n请输入新进程的优先级\n"); scanf("%s",&Cpu.Priority); printf("请输入新进程的大小\n"); scanf("%s",&Cpu.Size); First++;
//进程控制块 //进程标识符 //进程优先级 //进程大小 //进程的信息
char Priority[10]; char Message[10];
//运行进程。
//Number2是挂起队列中的进程个数; //First是判断是否是第一次输入进程。
int Number1=0,Number2=0,First=0; //Number1是就绪队列中的进程的个数;
/******************************************************************************
} else {
printf("\n请输入新进程的Pid\n"); scanf("%s",&Ready[Number1].Pid); printf("请输入新进程的优先级\n"); scanf("%s",&Ready[Number1].Priority); printf("请输入新进程的大小\n"); scanf("%s",&Ready[Number1].Size); Number1++; } } }
/********************************************************************************/
//查看正在运行的进程; void Run() {
printf("\n现在正在运行的进程的资料如下:\n");
printf("PID码为:%s\n优先级为:%s\n大小为:%s",Cpu.Pid,Cpu.Priority,Cpu.Size); }
void ChangeA()//将优先级高的进程调入CPU 执行 {
char i,m[10],t[10];char n[10],p[10];
strcpy(p,Ready[0].Priority);//就绪数组第一个数 for(i=0;i
if(strcmp(p,Ready[i].Priority)
(ascii )比较字符串str1和str2,当str1str2时,返回值>0 */ {
strcpy(p,Ready[i].Priority); //把Ready[i].Priority所指向的由NULL 结束的字符串复制到p 所指的数组中。 } }
for(i=0;i
if(strcmp(p,Ready[i].Priority)==0) //用法同上 {
strcpy(m,Cpu.Size); //用法同上,以下所有关于这两个函数的用法都同上面所解释的 strcpy(Cpu.Size,Ready[i].Size); strcpy(n,Cpu.Pid);
strcpy(Cpu.Pid,Ready[i].Pid); strcpy(t,Cpu.Priority);
strcpy(Cpu.Priority,Ready[i].Priority); break; }
else continue; }
for(i;i
strcpy(Ready[i].Size,Ready[i+1].Size); strcpy(Ready[i].Pid,Ready[i+1].Pid); strcpy(Ready[i].Priority,Ready[i+1].Priority); }
strcpy(Ready[i].Size,m); strcpy(Ready[i].Pid,n); strcpy(Ready[i].Priority,t); }
/********************************************************************************/
//手动将进程挂起 void ChangeB() {
int i;char p[10];
printf("\n请输入想要挂起的进程的PID 码:\n(在以下中选:"); for(i=0;i
printf("就绪%s ",Ready[i].Pid); }
printf(")\n"); scanf("%s",&p); for(i=0;i
if(strcmp(p,Ready[i].Pid)==0) {
strcpy(Hung[Number2].Size,Ready[i].Size); strcpy(Hung[Number2].Pid,Ready[i].Pid); strcpy(Hung[Number2].Priority,Ready[i].Priority); Number2++; break; }
else continue; }
for(i;i
strcpy(Ready[i].Size,Ready[i+1].Size); strcpy(Ready[i].Pid,Ready[i+1].Pid); strcpy(Ready[i].Priority,Ready[i+1].Priority); }
Number1--; }
/********************************************************************************/
//将挂起的进程按先进先出的方式调入就绪队列 void ChangeC() { int i;
strcpy(Ready[Number1].Size,Hung[0].Size); strcpy(Ready[Number1].Pid,Hung[0].Pid); strcpy(Ready[Number1].Priority,Hung[0].Priority); Number1++;
for(i=0;i
strcpy(Hung[i].Size,Hung[i+1].Size); strcpy(Hung[i].Pid,Hung[i+1].Pid); strcpy(Hung[i].Priority,Hung[i+1].Priority); }
Number2--;
for(i=0;i
printf("就绪队列为:\nPID} }
/********************************************************************************/
//手动将就绪进程调入CPU 执行 void ChangeD() {
char i,m[10],t[10];char p[10];char n[10];
printf("\n请输入想要运行的进程的PID 码:\n(在以下中选:"); for(i=0;i
printf("就绪%s ",Ready[i].Pid); }
码为:%s;\n优先级为:%s;\n大小
为:%s\n",Ready[i].Pid,Ready[i].Priority,Ready[i].Size);
scanf("%s",&p);
for(i=0;i
{
if(strcmp(p,Ready[i].Pid)==0)
{
strcpy(m,Cpu.Size);
strcpy(Cpu.Size,Ready[i].Size);
strcpy(Ready[i].Size,m);
strcpy(n,Cpu.Pid);
strcpy(Cpu.Pid,Ready[i].Pid);
strcpy(Ready[i].Pid,n);
strcpy(t,Cpu.Priority);
strcpy(Cpu.Priority,Ready[i].Priority);
strcpy(Ready[i].Priority,t);
break;
}
else continue;
}
}
/********************************************************************************/
//手动将挂起的进程调入就绪队列
void ChangeE()
{
int i;char p[10];
printf("\n请输入想要调入就绪的进程的PID 码:\n(在以下中选:");
for(i=0;i
{
printf("挂起%s ",Hung[i].Pid);
}
printf(")\n");
scanf("%s",&p);
for(i=0;i
{
if(strcmp(p,Hung[i].Pid)==0)
{
strcpy(Ready[Number1].Size,Hung[i].Size);
strcpy(Ready[Number1].Pid,Hung[i].Pid);
strcpy(Ready[Number1].Priority,Hung[i].Priority);
break;
}
}
Number1++;
for(i;i
{
strcpy(Hung[i].Size,Hung[i+1].Size);
strcpy(Hung[i].Pid,Hung[i+1].Pid);
strcpy(Hung[i].Priority,Hung[i+1].Priority);
}
Number2--;
for(i=0;i
{
printf("就绪队列为:\nPID
}
}
/********************************************************************************/
//换入换出实现函数
void Change()
{
int a;
printf("\n请你选择需要的交换方式:\n");
printf("1.将优先级高的进程调入CPU 执行.\n");
printf("2.手动将进程挂起.\n");
printf("3.将挂起的进程按先进先出的方式调入就绪队列.\n");
printf("4.手动将就绪进程调入CPU 执行.\n");
printf("5.手动将挂起的进程调入就绪队列.\n");
scanf("%d",&a);
switch(a)
{
case 1:
ChangeA();
break;
case 2:
ChangeB();
break;
case 3:
ChangeC();
break;
case 4:
ChangeD();
码为:%s;\n优先级为:%s;\n大小为:%s\n",Ready[i].Pid,Ready[i].Priority,Ready[i].Size);
break;
case 5:
ChangeE();
break;
default:
break;
}
}
/********************************************************************************/
//杀死进程
void Kill()
{
char i;char p[10];
printf("\n请输入想要杀死的进程的PID 码:\n(在以下中选:");
printf("运行%s ",Cpu.Pid);
for(i=0;i
{
printf("挂起%s ",Hung[i].Pid);
}
for(i=0;i
{
printf("就绪%s ",Ready[i].Pid);
}
printf(")\n");
scanf("%s",&p);
for(i=0;i
{
if(strcmp(p,Hung[i].Pid)==0)
{
for(i;i
{
strcpy(Hung[i].Size,Hung[i+1].Size);
strcpy(Hung[i].Pid,Hung[i+1].Pid);
strcpy(Hung[i].Priority,Hung[i+1].Priority);
}
Number2--;
break;
}
else continue;
}
for(i=0;i
if(strcmp(p,Ready[i].Pid)==0)
{
for(i;i
{
strcpy(Ready[i].Size,Ready[i+1].Size);
strcpy(Ready[i].Pid,Ready[i+1].Pid);
strcpy(Ready[i].Priority,Ready[i+1].Priority);
}
Number1--;
break;
}
else continue;
}
if(strcmp(p,Cpu.Pid)==0)
{
strcpy(Cpu.Size,Ready[0].Size);
strcpy(Cpu.Pid,Ready[0].Pid);
strcpy(Cpu.Priority,Ready[0].Priority);
for(i=0;i
{
strcpy(Ready[i].Size,Ready[i+1].Size);
strcpy(Ready[i].Pid,Ready[i+1].Pid);
strcpy(Ready[i].Priority,Ready[i+1].Priority);
}
Number1--;
}
}
void ShareMemory() //共享存储器通信
{
int i,operate;
char p[10];
char sha1[20]="Hello!";//共享存储区分区该数据是用来给其他进程读的
char sha2[10]; //共享存储区分区,用来提供给其他进程的写操作
printf("\n共享存储区已有数据为:");
printf("%s",sha1);
printf("\n\n1.为向共享存储区里读数据,. 为向共享存储区里写数据\n");
printf("\n请选择操作:");
scanf("%d",&operate);
printf("\n请输入共享存储器通信的进程的Pid 码:");
scanf("%s",&p);
if(operate==1)
printf("读取数据为:");
printf("%s", sha1);
}
else
{
printf("请写入数据:");
gets(sha2);
gets(sha2);
printf("您向共享存储区中写入的数据是:");
puts(sha2);
printf("此时共享存储区中的数据为:");
strcat(sha1,sha2);
printf("%s",sha1);
}
for (i = 0;i
{
if (strcmp(p, Hung[i].Pid) == 0)
{
for (i;i
{
strcpy(Hung[i].Message, sha2);
}
break;
}
else continue;
}
for (i = 0;i
{
if (strcmp(p, Ready[i].Pid) == 0)
{
for (i;i
{
strcpy(Ready[i].Message, sha2);
}
break;
}
else continue;
}
if (strcmp(p, Cpu.Pid) == 0)
{
strcpy(Cpu.Message, sha2);
}
/********************************************************************************/
//消息传递通信
void MsgPass()
{
int i;
char p[10], q[10];
char buffer[20]; //分配内存存放消息的缓冲区,数组的大小可以更大,由于动态数组控制 //起来比较麻烦,就采用预存大空间来分配了
printf("\n请输入发送消息的进程Pid:");
scanf("%s", &q);
printf("\n请输入Send 的消息内容:");
scanf("%s",&buffer);
printf("\n此时消息缓冲队列中的内容为:");
printf("%s",buffer);
printf("\n\n请输入接收消息的进程Pid:");
scanf("%s", &p);
printf("\n接收进程从消息缓冲区中Receive 的消息内容是:");
printf("%s",buffer);
for (i = 0;i
{
if (strcmp(p, Hung[i].Pid) == 0)
{
for (i;i
{
strcpy(Hung[i].Message, buffer);
}
break;
}
else continue;
}
for (i = 0;i
{
if (strcmp(p, Ready[i].Pid) == 0)
{
for (i;i
{
strcpy(Ready[i].Message, buffer);
}
break;
else continue;
}
if (strcmp(p, Cpu.Pid) == 0)
{
strcpy(Cpu.Message, buffer);
}
}
//直接通信
void ZJTX()
{
int i;
char a[5], b[5];
char buffer[20]; //分配内存存放消息的缓冲区,数组的大小可以更大,由于动态数组控制 //起来比较麻烦,就采用预存大空间来分配了
for (i=1;i
a[i]=b[i] ;
printf("\n请输入发送消息进程的Pid:");
scanf("%s", &b);
printf("\n请输入Send 的消息内容:");
scanf("%s",&buffer);
printf("\n此时消息缓冲队列中的内容为:");
printf("%s",buffer);
printf("\n\n请输入接收消息的进程Pid:");
scanf("%s", &a);
printf("\n接收进程从消息缓冲区中Receive 的消息内容是:");
printf("%s",buffer);
}
void main()//主实现函数。
{
int n;
char a;
n=1;
while(n==1)
{
//system("cls"); //清屏函数会清除上一次的输入数据,那么创建的进程会被清屏, //那后面的操作就没法继续,需要重来了,所以删除了该函数
printf("\n***********************************************");
printf("\n* *");
printf("\n* 进程控制系统模拟演示 *");
printf("\n* *");
printf("\n* 1. 创建新的进程 *");
printf("\n* *");
printf("\n* 2. 查看运行进程 *");
printf("\n* *");
printf("\n* 3. 调度某个进程 *");
printf("\n* *");
printf("\n* 4. 杀死某个进程 *");
printf("\n* *");
printf("\n* 5. 退出演示系统 *");
printf("\n* *");
printf("\n***********************************************");
printf("\n请选择你将要进行的操作:");
a=getche(); //特别强调这个吸收回车的函数在VS2005中会有警告,因为在VS2005 //中,它是不安全的,所以要写成a=_getche();但在VC++6.0则不用改写.. switch(a)
{
case'1':
fork();
break;
case'2':
Run();
break;
case'3':
Change();
break;
case'4':
Kill();
break;
case'5':
exit(0);
default:
printf("\n");
printf("\n");
printf("\n-------------输入有错,请重新输入!------------\n");
break;
}
printf("\n=============================================\n");
}
}