实验一 进程控制

本文介绍了如何使用C语言模拟实现进程的创建、查看运行状态、阻塞、唤醒和杀死功能,通过实例展示了进程控制的基本概念和操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【实验目的】

1.理解进程的概念,明确进程和程序的区别

2.理解并发执行的实质。

3.掌握进程的创建、睡眠、撤销等进程控制方法。

【实验内容】

用C语言编写程序,模拟实现创建新的进程:查看运行进程;换出某个进程:杀死运行进程等功能。

【实验步骤】

1.数据结构

struct jincheng_type//定义一个进程控制块

{

int pid;//进程标识符

int youxian;//进程优先级

int daxiao;

int zhuangtai;//标识进程状态,0-不在内存,1-在内存,2-阻塞

char info[10];

}

struct jincheng_type neicun[20];//结构体数组,存放20个进程控制块

int shumu=0,zuse=0,pid,flag=0;//定义变量

void Create(void)//创建一个进程

void Run(void)//查看一个进程

void Zuse(void)//阻塞一个进程

void Kill(void)//杀死一个进程

void Huanxing(void)//唤醒一个进程

2 .程序流程图

实验代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct jincheng_type

{

int pid;

int youxian;

int daxiao;

int zhuangtai;//标识进程状态,0-不在内存,1-在内存,2-阻塞

char info[10];

};

struct jincheng_type neicun[20];

int shumu = 0;

int pid;

int zuse = 0;

int flag = 0;

void Create(void)

{

if(shumu >= 20)

printf("内存已满,请先唤醒或杀死进程\n");

else

{

int i = 0;

int j = 0;

for(i = 0; i < 20; i++)

{

//定位,找到可以还未创建的进程

if(neicun[i].zhuangtai == 0)

{

for(j = 0; j < i; j++)

if(neicun[i].pid == neicun[j].pid)

{

printf("该进程已存在\n");

return;

}

}

printf("请输入新进程pid:\n");

scanf("%d", &(neicun[i].pid));

printf("请输入新进程优先级:\n");

scanf("%d", &(neicun[i].youxian));

printf("请输入新进程大小:\n");

scanf("%d", &(neicun[i].daxiao));

printf("请输入新进程内容:\n");

scanf("%s", neicun[i].info);

//创建进程,使标记位为1

neicun[i].zhuangtai = 1;

printf("进程已成功创建!\n");

shumu++;

break;

}

}

}

void Run(void)

{

int i = 0;

for(i = 0; i < 20; i++)

{

if(neicun[i].zhuangtai == 1)

{

//输出运行进程的各个属性值

printf("pid=%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");

}

}

void Zuse(void)

{

int i = 0;

if(!shumu)

{

printf("当前没有运行进程\n");

return;

}

printf("输入阻塞进程的pid值:\n");

scanf("%d", &pid);

for(i = 0; i < 20; i++)

{

//定位,找到所要阻塞的进程,根据其状态做相应处理

if(pid == neicun[i].pid)

{

if(neicun[i].zhuangtai == 1)

{

neicun[i].zhuangtai = 2;

zuse++;

printf("已经成功阻塞进程\n");

}

else if(neicun[i].zhuangtai == 0)

{

printf("要阻塞的进程不存在\n");

}

else

{

printf("要阻塞的进程已被挂起\n");

}

flag = 1;

break;

}

}

if(flag == 0)

{

printf("要阻塞的进程不存在\n");

}

}

void Kill(void)

{

int i = 0;

if(!shumu)

{

printf("当前没有运行进程\n");

return;

}

printf("请输入pid进程值:\n");

scanf("%d", &pid);

for(i = 0; i < 20; i++)

{

//定位,找到所要杀死的进程,根据其状态做相应处理

if(pid == neicun[i].pid)

{

if(neicun[i].zhuangtai == 1)

{

neicun[i].zhuangtai == 0;

shumu--;

printf("已成功杀死进程\n");

}

else if(neicun[i].zhuangtai == 0)

printf("要杀死的进程不存在\n");

else

printf("要杀死的进程已被挂起\n");

flag=1;

break;

}

}

//找不到,则说明进程不存在

if(!flag)

printf("要杀死的进程不存在\n");

}

void Huanxing(void)

{

int i = 0;

if(!shumu)

{

printf("当前没有运行进程\n");

return;

}

if(!zuse)

{

printf("当前没有挂起进程\n");

return;

}

printf("请输入唤醒进程的pid值:\n");

scanf("%d", &pid);

for(i = 0; i < 20; i++)

{

//定位,找到所要唤醒的进程,根据其状态做相应处理

if(pid == neicun[i].pid)

{

flag = false;

if(neicun[i].zhuangtai == 2)

{

neicun[i].zhuangtai = 1;

zuse--;

printf("已经成功唤醒进程\n");

}

else if(neicun[i].zhuangtai == 0)

printf("要唤醒的进程不存在\n");

 else

printf("要唤醒的进程已被唤醒\n");

break;

}

}

//找不到,则说明进程不存在

if(!flag)

printf("要唤醒的进程不存在\n");

}

int main(void)

{

int n = 1;

int num;

int i = 0;

//一开始所有进程都不在内存中

for(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;//恢复标记

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值