栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

操作系统实验(一):c实现创建、查看、杀死进程等功能的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

操作系统实验(一):c实现创建、查看、杀死进程等功能的实现

一、【实验目的】
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;//恢复标记
     }
 }
}

实验结果自行调试~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号