一、【实验目的】
1.理解进程的概念,明确进程和程序的区别
2.理解并发执行的实质。
3.掌握进程的创建、睡眠、撤销等进程控制方法。
二、【实验内容】
用C语言编写程序,模拟实现创建新的进程:查看运行进程;换出某个进程:杀死运行进程等功能。
三、【实验步骤】
数据结构:
struct jinChengType
{
int pid;
int youXian;
int daXiao;
int zhuangTai;
char info[10];
};
struct jinChengType neiCun[20];
int shuMu = 0;
int zuse = 0;
int pid = 0;
int flag = 0;
实验代码:
#include <stdio.h>
#include <stdlib.h>
struct jinChengType
{
int pid;
int youXian;
int daXiao;
int zhuangTai;//标识进程状态,0-不在内存,1-在内存,2-阻塞
char info[10];
};
struct jinChengType neiCun[20];
int shuMu = 0;
int zuse = 0;
int pid = 0;
int flag = 0;
void create()
{
if(shuMu >= 20)
{
printf("\n内存已满,请先唤醒或杀死进程\n");
}
else
{
int i;
for(i = 0; i < 20; i++)
{
//定位,找到可以还未创建的进程
if(neiCun[i].zhuangTai == 0)
break;
}
printf("\n请输入新进程pid\n");
scanf("%d", &(neiCun[i].pid));
for(int j = 0; j < i; j++)
{
if(neiCun[i].pid == neiCun[j].pid)
{
printf("\n该进程已存在\n");
return;
}
}
printf("\n请输入新进程优先级\n");
scanf("%d", &(neiCun[i].youXian));
printf("\n请输入新进程大小\n");
scanf("%d", &(neiCun[i].daXiao));
printf("\n请输入新进程内容\n");
scanf("%s", &(neiCun[i].info));
//创建进程,使标记位为1
neiCun[i].zhuangTai = 1;
shuMu++;
}
}
void run()
{
for(int i = 0; i < 20; i++)
{
if(neiCun[i].zhuangTai == 1)
{
//输出运行进程的各个属性值
printf("\npid=%d\n",neiCun[i].pid);
printf("youXian=%d\n",neiCun[i].youXian);
printf("daXiao=%d\n",neiCun[i].daXiao);
printf("zhuangTai=%d\n",neiCun[i].zhuangTai);
printf("info=%s\n",neiCun[i].info);
flag = 1;
}
}
if(!flag)
{
printf("\n当前没有运行进程\n");
}
}
void Zuse()
{
if(!shuMu)
{
printf("当前没有运行进程\n");
return;
}
printf("\n输入阻塞进程的pid值\n");
scanf("%d", &pid);
for(int i = 0; i < 20; i++)
{
//定位,找到所要阻塞的进程,根据其状态做相应处理
if(pid == neiCun[i].pid)
{
if(neiCun[i].zhuangTai == 1)
{
neiCun[i].zhuangTai = 2;
zuse++;
printf("\n已经成功阻塞进程\n");
}
else if(neiCun[i].zhuangTai == 0)
{
printf("\n要阻塞的进程不存在\n");
}
else
{
printf("\n要阻塞的进程已被挂起\n");
}
flag = 1;
break;
}
}
//找不到,则说明进程不存在
if(flag == 0)
{
printf("\n要阻塞的进程不存在\n");
}
}
void kill()
{
if(!shuMu)
{
printf("当前没有运行进程\n");
return;
}
printf("\n输入杀死进程的pid值\n");
scanf("%d", &pid);
for(int i = 0; i < 20; i++)
{
//定位,找到所要杀死的进程,根据其状态做相应处理
if(pid == neiCun[i].pid)
{
if(neiCun[i].zhuangTai == 1)
{
neiCun[i].zhuangTai = 0;
shuMu--;
printf("\n已成功杀死进程\n");
}
else if(neiCun[i].zhuangTai == 0)
{
printf("\n:要杀死的进程不存在\n");
}
else
{
printf("\n要杀死的进程已被阻塞\n");
}
flag = 1;
break;
}
}
//找不到,则说明进程不存在
if(!flag)
{
printf("\n要杀死的进程不存在\n");
}
}
void huanxing()
{
if(!shuMu)
{
printf("\n当前没有运行进程\n");
return;
}
if(!zuse)
{
printf("\n当前没有阻塞进程\n");
return;
}
printf("\n输入pid:\n");
scanf("%d", &pid);
for(int i = 0; i < 20; i++)
{
//定位,找到所要杀死的进程,根据其状态做相应处理
if(pid == neiCun[i].pid)
{
flag = false;
if(neiCun[i].zhuangTai == 2)
{
neiCun[i].zhuangTai = 1;
zuse--;
printf("\n已经成功唤醒进程\n");
}
else if(neiCun[i].zhuangTai == 0)
{
printf("\n要唤醒的进程不存在\n");
}
else
{
printf("\n要唤醒的进程已被阻塞\n");
}
break;
}
}
//找不到,则说明进程不存在
if(flag)
{
printf("\n要唤醒的进程不存在\n");
}
}
int main()
{
int n = 1;
int num;
//一开始所有进程都不在内存中
for(int i = 0; i < 20; i++)
{
neiCun[i].zhuangTai = 0;
while(n)
{
printf("\n***********************************************************");
printf("\n*进程演示系统*");
printf("\n***********************************************************");
printf("\n*1.创建新的进程 2.查看运行进程*");
printf("\n*3.阻塞某个进程 4.杀死运行进程*");
printf("\n*5.唤醒某个进程 6.退出系统*");
printf("\n***********************************************************");
printf("\n请选择(1~6)\n");
scanf("%d", &num);
switch(num)
{
case 1:
{
create();
break;
}
case 2:
{
run();
break;
}
case 3:
{
Zuse();
break;
}
case 4:
{
kill();
break;
}
case 5:
{
huanxing();
break;
}
case 6:
{
exit(0);
}
default:
{
n=0;
}
}
flag = 0;//恢复标记
}
}
}
实验结果自行调试~