c语言进程管理
❶ c语言模拟操作系统进程调度和管理
给,已经编译运行通过了,简单写的:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
/*********************以下是全局数据结构和变量***********************/
/*PCB 结构*/
struct PCB{
int pname;
int pri;
int runtime;
int waittime;
struct PCB *next;
}pcb[7];
/* 运行指针*/
struct PCB *running;
/*高优先级就绪队列头指针*/
struct PCB *Hready;
/*低优先级队列头指针*/
struct PCB *Lready;
/*等待队列头指针*/
struct PCB *wait;
int sig=0;
/**************************以下是函数说明****************************/
/*利用循环实现延迟*/
void delay();
/*模拟进程3-9*/
void proc(struct PCB *running);
/*将node插入到head所指示的队列的尾部*/
void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);
/*进程调度函数*/
int proc_switch();
/*进程等待函数*/
void proc_wait();
/*进程唤醒函数*/
int proc_wakeup();
/************************以下是函数定义及注释************************/
/*主函数*/
main()
{
int i;
/*初始化,创建进程3-9,置低优先级,等待时间为0,
依次插入低优先级队列*/
for(i = 0;i < 7;i++){
pcb[i].pname = i+3;
pcb[i].pri = 0;
pcb[i].waittime = 0;
InsertIntoQueueTail(&Lready,&pcb[i]);
}
/*等待队列和高优先级队列为空*/
wait = NULL;
Hready=NULL;
printf("\nThe process_switch begin:\n");
/*模拟进程调度开始*/
for(;;)
{
switch(sig){
case 0:/*无进程等待调度,打印信息并返回*/
if(!proc_switch())
{
printf("No Process to run,press any key to return:\n");
getchar();
}
break;
case 1:proc_wait();
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:proc(running);
break;
default:printf("\nerror!");
exit(-1);
}
}
}
/*功能:延迟一个时间片*/
/*入口参数:无*/
/*出口参数:无*/
void delay()
{
int i,j;
for(i=0;i<20000;i++)
for(j=0;j<10000;j++)
{
}
}
/*功能:进程3-9*/
/*入口参数:运行指针*/
/*出口参数:无*/
void proc(struct PCB * running)
{
int i;
srand( (unsigned)time( NULL ) );
/*显示当前运行的进程的id*/
printf("\nNow Process %d is running\n",running->pname);
/*当前进程执行running->runtime个时间片*/
for(i=running->runtime;i>0;i--){
/*显示剩余的时间片*/
printf("%d time slice(s) left\n",i);
/*延迟*/
delay();
proc_wakeup();
/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/
if((rand()%1000+1)<100){
printf("Process %d begins to wait.\n",running->pname);
sig=1;
return;
}
}
/*显示时间片耗尽,进程转为低优先级就绪状态*/
printf("Time slices for process %d exhausted.\n",running->pname);
InsertIntoQueueTail(&Hready,running);
sig=0;
return;
}
/*功能:将一个节点插入队列尾部*/
/*入口参数:队列头指针地址head,待插入结点node*/
/*出口参数:无*/
void InsertIntoQueueTail(struct PCB **head,struct PCB *node)
{
struct PCB *p;
node->next=NULL;
/*被插入队列为空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入队列不为空*/
else{
p=*head;
/*找到队列的最后一个结点*/
while(p->next!=NULL) p=p->next;
p->next=node;
}
}
/*功能:进程调度*/
/*入口参数:无*/
/*出口参数:若调度成功,返回1,否则返回0*/
int proc_switch()
{
/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/
while(Hready == NULL && Lready == NULL)
if(!proc_wakeup()) return 0;
/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/
if(Hready != NULL){
running = Hready;
Hready = Hready -> next;
running->runtime = 2;
}
/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,
分配5个时间片*/
else{
running = Lready;
Lready=Lready -> next;
running -> runtime = 5;
}
/*别调度进程的id赋给sig*/
sig = running -> pname;
return 1;
}
/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,
插入等待队列尾部*/
/*入口参数:无*/
/*出口参数:无*/
void proc_wait()
{
struct PCB *p;
running->pri=1;
running->waittime=20;
InsertIntoQueueTail(&wait,running);
sig=0;
return;
}
/*功能:进程唤醒*/
/*入口参数:无*/
/*出口参数:若等待队列为空,则返回0,否则返回1*/
int proc_wakeup()
{
struct PCB *p,*last,*MoveToReady;
p = wait;
/*等待队列为空,返回0*/
if(p == NULL) return 0;
/*延迟*/
delay();
/*等待队列中每个进程的等待时间减1*/
while(p != NULL){
p -> waittime -= 1;
p=p->next;
}
p=wait;
/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/
while(p!=NULL){
if(p -> waittime == 0){
MoveToReady = p;
if (p == wait)
wait = p->next;
else
last -> next = p->next;
p = p -> next;
InsertIntoQueueTail(&Hready,MoveToReady);
}
else{
p = p -> next;
}
}
sig =0;
return 1;
}
❷ 应用进程管理器 在c语言里怎么表示
360tray.exe--360实时保护360Safe.exe--360主程序liveupdate360.exe--360升级加速safeboxTray--360保险箱保护程序360safebox.exe--360保险箱主程序望采纳 (*^__^*) 嘻嘻……
❸ 用c语言编写的进程管理程序
#include<conio.h>
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
structPCB_type
{charpid[100];//进程名输入用字符串健壮性比较好
intpriority;
intcputime;
intstate;
};//缺少“};”
intshumu=0,pid_l;
structPCB_typeneicun[20];
structPCB_typehc[10];
intmax=0;
intnumber=0;
voidcreate();
voidrun();
voidhuanchu();
voidkill();
intmain()
{
intn,a;
n=1;
system("color1d");
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)
{case1:
create();
printf(" pressanykeytogoon~");
getch();
break;
case2:
run();
printf(" pressanykeytogoon~");
getch();
break;
case3:
huanchu();
printf(" pressanykeytogoon~");
getch();
break;
case4:
kill();
printf(" pressanykeytogoon~");
getch();
break;
case5:
exit(0);
default:
n=1;
break;
}
}
}
voidcreate()
{
if(shumu>=20)
{
printf(" 内存已满,请先结束或换出进程 ");
}
else
{
shumu++;
printf(" 请输入新进程的程序名 ");
scanf("%s",neicun[shumu-1].pid);
printf(" 请输入新进程的优先级(数字) ");//
scanf("%d",&neicun[shumu-1].priority);
printf(" 请输入新进程的需要的运行时间 ");//
scanf("%d",&neicun[shumu-1].cputime);
printf(" 创建进程时令其状态为就绪 ");
neicun[shumu-1].state=2;//1为等待,2就绪,3为运行
}
printf(" 创建进程成功! ");
}
voidrun()
{
if(shumu<=0)//查看//判断是否存在进程
{
printf("当前状态无进程,按任意键继续创建进程 ");
return;
}
intmax=0;
for(inti=0;i<shumu;i++)//
if((neicun[i].state==2&&neicun[i].priority>=neicun[max].priority))
{
max=i;//这里判断优先级,优先级高的进程优先执行。
}
if(neicun[max].state==2)
{
neicun[max].state=3;//进程运行,状态为3
system("color5F");
printf("/*********************当前已有进程%d个*************************/: ",shumu);
for(inti=0;i<shumu;i++){
printf("进程编号:%d",i+1);
printf(" /***********正在运行进程程序名:%s*************************/ ",neicun[i].pid);
printf(" /***********该进程的优先级:%d*****************************/ ",neicun[i].priority);
printf(" /***********该进程的需要运行时间:%d***********************/ ",neicun[i].cputime);
printf(" /***********该进程的状态:%d(1为等待,2就绪,3为运行)******/ ",neicun[i].state);}//这里增加显示当前运行的进程
}
}
/*换出*/
voidhuanchu()
{
intk;
if(shumu<=0)//判断是否存在进程
{
printf("当前进程数目为0,不能执行该操作 ");
return;
}
printf("当前已有进程%d个: ",shumu);
for(inth=0;h<shumu;h++)//当前所有的进程
printf("序号:%d 程序名:%s 优先级:%d 运行时间:%d 状态:%d "
,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state);
printf("请输入要换出程序的序号:");
scanf("%d",&k);
if(neicun[k].state==3)
{
neicun[k].state=1;
printf("已被换出,进程名为:%s、状态为:[%d]",neicun[k].pid,neicun[k].state);
}
else
printf("无法换出,进程名为:%s的进程",neicun[k].pid);//换出结果提示
}
voidkill()
{
if(shumu<=0)//对存在的进程进行判断
{
printf("当前进程数目为0,不能执行该操作 ");
return;
}
intk=0;
printf("/******************当前已有进程%d个******************/: ",shumu);
for(inth=0;h<shumu;h++)//当前所有的进程
printf("序号:%d 程序名:%s 优先级:%d 运行时间:%d 状态:%d "
,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state);
printf("请输入要杀死程序的序号:");
scanf("%d",&k);
neicun[k].cputime=0;
neicun[k].priority=0;
neicun[k].state=0;
if(k==(shumu-1))
shumu--;
else{
for(intj=k+1;j<shumu;j++)
{
strcmp(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--;
}
printf("进程名为:%s已被杀死! ",neicun[k].pid);//显示进程已被杀死
}
❹ 操作系统的课程设计~进程控制系统~用C语言编写的
补充:
这个程序当然可以在WINDOWS下编辑了.
不过编译就必须要UNIX了.
下面的程序假设你的当前目录有一个helloworld程序,
这个你会写吧?
:)
#include
<stdio.h>
#include
<unistd.h>
#include
<sys/wait.h>
int
main()
{
int
pid;
int
status;
pid
=
fork();
if
(pid
==
0)
{
/*
child
process
*/
execve("./helloworld",
NULL,
NULL);
}
else
if
(pid
<
0)
{
/*
failed
to
fork,
print
error
message
*/
printf("fork
error,
errno
=
%d\n",
errno);
}
else
{
waitpid(pid,&status,0)
}
return
0;
}
❺ \c语言\ _\结束进程\
首先确定进程空间,然后查找到进程的句柄,在用某个系统调用结束它。
在现代计算机系统中,进程管理是操作系统的工作,所以就必须进行系统调用才能结束进程,这就涉及到了你的具体环境,比如是Win32的API还是linux下的C编程,他们的方法是不同的。
❻ 如何用c语言实现linux进程管理
你搜索一下关于“c shell”的命令,可以找到关于linux的进程管理,不是很复杂
❼ 用C语言,数据结构实现进程的创建,追加,删除,查找,退出
需要设计进程控制块的主体数据结构PCB, 进程控制块需要包含进程管理的几个主要的数据要素如下:
1. 后继指针
2. 现场指针
进程创建主要完成数据的初始化,并把进程放入就绪队列
不需要追加函数, 对于删除,退出通常是数据结构的处理, 比较重要的是进程的调度,这里需要涉及到对CPU体系结构的依赖,需要了解CPU的寄存器,X86,ARM, PPC都有区别。
❽ c语言怎么实现对windows进程管理器中的进程进行管理
进程之间是相互隔离的,你可以调用CreateToolhelp32Snapshot进行获得进程使用和线程快照,如果终止当前进程可用ExitProcess,如果结束其它进程可用TerminateProcess
❾ 求: 用c语言实现进程控制的源码
createthread(...)等等有一系列windowsAPI
你愿意用吗?
pv操作是利用信号量等的变量实现的,也有专门的api函数用于操作信号量等