struct jincheng_type{ // 定义表示进程信息的结构体 出 };
struct jincheng_type neicun[20]; 标志位
void create() //函数--创建一个新进程 { 用 元
scanf(\"%d\",&(neicun[i].pid)); for(int j=0;jif(neicun[i].pid==neicun[j].pid) {
printf(\"\\n该进程已存在\\n\"); return;
//当输入的新进程与原有进程ID
printf(\"\\n请输入新进程pid\\n\");
//输入新进程ID存至选出的存单
if(shumu>=20) printf(\"\\n存已满,请先换出或杀死进程\\n\"); else{
for(int i=0;i<20;i++)
if(neicun[i].zhuangtai==0) break;
//选出空着的存单元给新进程使
//判断存空间是否已满
//定义20个存单位给进程使用
int shumu=0,guaqi=0,pid,flag=0; //定义正在执行进程数目,被挂起进程数目,进程ID,运行
int info;
//容
int pid;
//进程ID
//大小
//进程的状态,这里用0表示没有建立或被杀死,1表示执行,2表示换
int youxian; //优先级 int daxiao; int zhuangtai;
相同时,显示\"该进程已存在\"
.
.
}
}
}
//输入新进程的优先级、大小和容
printf(\"\\n请输入新进程优先级\\n\"); scanf(\"%d\",&(neicun[i].youxian)); printf(\"\\n请输入新进程大小\\n\"); scanf(\"%d\",&(neicun[i].daxiao)); printf(\"\\n请输入新进程容\\n\"); scanf(\"%s\",&(neicun[i].info)); neicun[i].zhuangtai=1; shumu++;
//将新进程的存单元状态//正在运行的进程数目加一
(zhuangtai)设成\"1\",以表示存在且未被换出
void run() 程 { }
//函数--查看正在运行的进
for(int i=0;i<20;i++) { } if(!flag)
printf(\"\\n当前没有运行进程\\n\");
//若当前没有运行进程(即
if(neicun[i].zhuangtai==1) { }
printf(\"\\n pid=%d--\",neicun[i].pid); printf(\"youxian=%d--\",neicun[i].youxian); printf(\"daxiao=%d--\",neicun[i].daxiao); printf(\"zhuangtai=%d--\",neicun[i].zhuangtai); printf(\"info=%c\",neicun[i].info); flag=1;
//将存在且未被挂起(即
zhuangtai=1)的进程显示出来,若存在这样的程序,则将flag设成1
flag=0),则显示\"当前没有运行进程\"
void huanchu() {
if(!shumu) {
//函数--换出进程 //判断是否无进程存在
printf(\"\\n当前没有进程存在\\n\"); return;
.
.
}
}
//输入需要换出的进程ID,
printf(\"\\n 输入唤出进程ID值\"); scanf(\"%d\",&pid); for(int i=0;i<20;i++) { } if(!flag)
if(pid==neicun[i].pid) { }
if(neicun[i].zhuangtai==1) { }
neicun[i].zhuangtai=2; guaqi++;
//若该ID代表的进程正在运行,则
将其挂起,即将zhuangyai置成2,并将guaqi加一
printf(\"\\n已经成功换出进程\\n\");
else if(neicun[i].zhuangtai==2) flag=1; break;
printf(\"\\n要唤出的进程已被挂起\\n\");
//若该ID代表的进程已被挂起,即zhuangtai==2,则显示'要唤出的进程已被挂起'
printf(\"\\n要唤出的进程不存在\\n\"); //若进程不存在,给出显示
void kill() {
if(!shumu) { }
//函数--杀死进程 //判断是否无进程存在
printf(\"\\n当前没有进程存在\\n\"); return;
//读入要杀死的进程ID
printf(\"\\n 输入杀死进程的ID值\"); scanf(\"%d\",&pid); for(int i=0;i<20;i++) {
if(pid==neicun[i].pid) {
//若进程正在运行则再次询问是
if(neicun[i].zhuangtai==1) {
否要杀死,通过用户的反馈执行不同操作
printf(\"\\n该进程正在运行,确定要杀死吗?\\n\"); printf(\"\\n请输入 1:Yes;0:NO \\n\"); scanf(\"%d\",&flag);
.
.
if(flag) { }
//将zhuangtai置为0,表示进程被
neicun[i].zhuangtai=0; shumu--;
杀死,并将shumu自减一
printf(\"\\n已经成功杀死进程\\n\");
printf(\"\\要杀死的进程正在运行\\n\");
else
}
else if(neicun[i].zhuangtai==2)
接杀死
{ neicun[i].zhuangtai=0; shumu--;
printf(\"\\n已经成功杀死进程\\n\");
} flag=1; break;
}
}
if(flag==0) printf(\"\\n要杀死的进程不存在\\n\"); }
void huanxing() { if(!shumu)
{ printf(\"\\n当前没有运行进程\\n\"); return;
}
if(!guaqi)
{ 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;
.
//若该进程已经被挂起,则直
//若进程不存在,给出显示
//函数--唤醒进程
//判断是否无进程存在
//判断是否无进程被挂起
//输入需要唤醒进程ID
.
}
}
}
if(neicun[i].zhuangtai==2) { }
neicun[i].zhuangtai=1; guaqi--;
//判断该进程是否被挂起,若没有则将
其唤醒并将guaqi自减一
printf(\"\\n已经成功唤醒进程\\n\");
else if(neicun[i].zhuangtai==2) flag=1; break;
printf(\"\\n要唤醒的进程已被挂起\\n\");
//若目标进程已被挂起,则显示'要唤醒的进程已被挂起'
if(!flag) printf(\"\\n要唤醒的进程不存在\\n\"); //若要唤醒的进程不存在,给出显示
void viewall() { }
void main() {
int n=1; int num;
//函数--查看存状态
for(int i=0;i<20;i++) //显示所有20个存单元的状态 { }
printf(\"\\n pid=%d\",neicun[i].pid); printf(\"youxian=%d\",neicun[i].youxian); printf(\"daxiao=%d\",neicun[i].daxiao); printf(\"zhuangtai=%d\",neicun[i].zhuangtai); printf(\"info=%c\",neicun[i].info);
//主函数
for(int i=0;i<20;i++) {
while(n)
//先将存zhuangtai位清零
neicun[i].zhuangtai=0;
printf(\"\\n fff \\n\"); printf(\"\\n printf(\"\\n printf(\"\\n printf(\"\\n printf(\"\\n
1.创建新的进程 \\n\"); 2.查看运行进程
\\n\");
\\n\");
3.唤出某个进程
printf(\"\\n*************************************************\\n\");
4.杀死某个进程 \\n\"); 5.唤醒某个进程 \\n\");
.
.
}
}
printf(\"\\n 6.查看存状态 \\n\");
printf(\"\\n 7.退出进程 \\n\");
printf(\"\\n*************************************************\\n\"); printf(\"\\n请选择(1-7)\\n\"); scanf(\"%d\",&num); switch(num) {
case 1:create();break; case 2:run();break; case 3:huanchu();break; case 4:kill();break; case 5:huanxing();break; case 6:viewall();break; case 7:exit(0); default:n=0; } flag=0;
//功能选择
4、程序运行演示与截图
(1)创建新进程,依次建立进程1、2、3,图中为建立进程2。
.
.
(2)查看运行的进程与查看存状态
(2)换出进程。图中以换出进程3为例。
(4)此时再次查看运行的进程与查看存状态,可以看到进程3已不在运行的进
.
.
程中,存状态中其zhuangtai标识等于2,表明进程3确实已被换出。
.
.
(5)唤醒进程。图为将进程3唤醒。
.
.
(6)此时再次查看运行的进程与查看存状态,可以看到进程3重新出现在运行的进程中,且存状态中其zhuangtai标识等于1,表明进程3已被成功唤醒。
(7)杀死进程。图中以杀死进程3为例,并附以杀死后运行的进程与存状态图,存状态中进程3的zhuangtai=0,表示进程3已被杀死。
.
.
.
.
5、 实验结论
通过这次实验,我了解到进程控制块在进程管理中的重要作用,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。同时也明白了我们平常使用程序的工作原理。
.