进程管理实验
<p>用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。 </p><p> </p><p>#define _CRT_SECURE_NO_DEPRECATE</p> #include <conio.h> #include <stdio.h> #include <stdlib.h> struct PCB_type { int pid; int priority; int cputime; int state; }; int shumu = 0; int pid_1; struct PCB_type neicun[20]; struct PCB_type hc[10]; int max = 0;int number = 0; void create(); void run(); void huanchu(); void kill(); /* 创建新进程 */ void create() { if (shumu >= 20) { printf("neicun is full "); } else { shumu++; printf("请输入新进程的程序名 "); scanf("%d", &neicun[shumu - 1].pid); printf("请输入新进程的优先级 "); scanf("%d", &neicun[shumu - 1].priority); printf("请输入新进程的运行时间 "); scanf("%d", &neicun[shumu - 1].cputime); printf("创建进程时令其状态为就绪 "); neicun[shumu - 1].state = 2; printf(" 创建进程成功! "); } } /* 查看当前运行进程 */ void run() { int max = 0; for (int i = 0;i<shumu;i++) { if ((neicun[i].state == 1) && (neicun[i].priority >= neicun[max].priority)) max = i; } neicun[max].state = 3; printf("当前运行进程程序名: %d", neicun[max].pid); printf(" 该进程的优先级: %d", neicun[max].priority); printf(" 该进程的运行时间: %d", neicun[max].cputime); printf(" 该进程的状态: %d", neicun[max].state); } /* 换出 */ void huanchu() { int k; printf("请输入要换出程序的程序名:"); scanf("%d", &k); for (int j = 0;j<shumu;j++) { if (neicun[j].state == 1) { hc[number].pid = neicun[j].pid; hc[number].state = neicun[j].state; hc[number].priority = neicun[j].priority; hc[number].cputime = neicun[j].cputime; number++; neicun[j].pid = 0; neicun[j].state = 0; neicun[j].priority = 0; neicun[j].cputime = 0; pid_1++; } else printf("进程%d无法换出的pid:%d ", j,neicun[j].pid); if (number != 0) { for (int i = 0;i < number;i++) { printf("当前运行进程程序名: %d", hc[i].pid); printf(" 该进程的优先级: %d", hc[i].priority); printf(" 该进程的运行时间: %d", hc[i].cputime); printf(" 该进程的状态: %d", hc[i].state); } } } PCB_type temp = neicun[0]; for (k = 0;k <= shumu;k++) { if (neicun[k].priority>temp.priority) temp = neicun[k]; } neicun[k].state = 1; } /* 杀死进程 */ void kill() { neicun[max].pid = 0; neicun[max].priority = 0; neicun[max].cputime = 0; neicun[max].state = 0; if (max == (shumu - 1)) shumu--; else { for (int j = max + 1;j<shumu;j++) { neicun[j - 1].pid = neicun[j].pid; neicun[j - 1].priority = neicun[j].priority; neicun[j - 1].cputime = neicun[j].cputime; neicun[j - 1].state = neicun[j].state; } shumu--; } max = 0; run(); } int main() { int n, a; n = 1; while (n == 1) { system("cls"); printf(" **********************************************"); printf(" * 进程演示系统 *"); printf(" **********************************************"); printf(" 1.创建新的进程 2.查看运行进程"); printf(" 3.换出某个进程 4.杀死运行进程"); printf(" 5.退出系统 "); printf(" **********************************************"); printf(" 请选择(1~5):"); scanf("%d", &a); switch (a) { case 1: create(); printf(" press anykey to go on~"); //getch(); system("pause"); break; case 2: run(); printf(" press anykey to go on~"); system("pause"); //getch(); break; case 3: huanchu(); printf(" press anykey to go on~"); system("pause"); //getch(); break; case 4: kill(); printf(" press anykey to go on~"); //getch(); system("pause"); break; case 5: exit(0); default: n = 0; break; } } }很久不用VS,中途出现了几个小问题
1.warning C4996: "getch": The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
这种警告是因为VS的C函数库有更新的安全版本,
如果源码只打算用VS编译可以改为使用安全版本
比如scanf改为scanf_s
如果需要使用其他编译器编译,就无视吧
如果你getch() 是为了暂停程序以便观察结果,并且你的源码并不打算用其他编译器编译
可以使用system("pause");替换getch();效果就是暂停程序并显示 "请按任意键继续. . ."
2.error C4996: "scanf": This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
原因是Visual C++ 2012 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:
《CRT函数的安全增强的版本》
下面给出这个问题的解决方案:
方法一:将原来的旧函数替换成新的 Security CRT functions。
方法二:用以下方法屏蔽这个警告:
1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 或声明 #param warning(disable:4996)
3. 更改预处理定义:
项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:
_CRT_SECURE_NO_DEPRECATE
方法三:方法二没有使用更加安全的 CRT 函数,显然不是一个值得推荐的好方法,但我们又不想一个一个地改函数名,这里还有一个更简便的方法:
在预编译头文件 stdafx.h 里(同样要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
在链接的时候便会自动将旧函数替换成 Security CRT functions 。
注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二(-_-)。即实际应在预编译头文件 stdafx.h 里加入下面两句:
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1