操作系统实验(一):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 <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;//恢复标记
     }
 }
}

实验结果自行调试~

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值