一、【实验目的】
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#include 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请输入新进程pidn"); 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=%dn",neiCun[i].pid); printf("youXian=%dn",neiCun[i].youXian); printf("daXiao=%dn",neiCun[i].daXiao); printf("zhuangTai=%dn",neiCun[i].zhuangTai); printf("info=%sn",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;//恢复标记 } } }
实验结果自行调试~



