📄 terminate.cpp
字号:
#include "basic.h"
pnode *proot;
pnode *plink;
#define MAX 100
//create process
int createpc(int *para)//参数是pid,ppid,及prio的值;
{
//add your code
pnode *p,*p1,*pp;
int pflag;
pflag=0;
for(p=plink;p;p=p->next)
{
if(p->node->pid == para[0]) //查看要新创建的进程是否已经存在,如果存在,提示并结束创建;
{
printf("pid %d is already exist!\n",para[0]);
return -1;
}
if(p->node->pid == para[1]) //查找新创建的进程的父进程,作用。。。。
{
pflag=1;
pp = p;
}
}
if(!pflag) //如果要新创建的进程的父进程不存在,提示,并结束创建;
{
printf("parent id %d is not exist!\n",para[1]);
return -2;
}
//创建新进程的结点,给新进程赋初值,
//其中子进程结点sub,进程链表的下一结点next,兄弟进程结点brother为空;
p1 = new pnode;
p1->node=new pcb;
p1->node->pid = para[0];
p1->node->ppid = para[1];
p1->node->prio = para[2];
p1->node->state=0;
p1->node->dflag=0;
p1->sub=NULL;
p1->next=NULL;
p1->brother=NULL;
for(p=plink;p;p=p->next)//根据进程优先级,确定进程状态
{
if(p->node->state == 1)
{
if(p->node->prio > p1->node->prio )
{
p->node->state=0;
p1->node->state=1; //执行
}
break;
}
}
//add to process tree
if(!pp->sub)//如果父进程还没有孩子结点,则作为第一子进程加入父进程树;
{
pp->sub=p1;
}
else //否则加到兄弟结点链表之后。
{
for(p=pp->sub;p->brother;p=p->brother)
{
;
}
p->brother=p1;
}
// add to process link
for(p=plink;p->next;p=p->next)//将进程加到进程链表内
{
;
}
p->next=p1;
return 0;
}
//Termination of Process
void terminatepc(int para)
{
pnode *p = new pnode;
pnode *p1,*p2,*p3,*pp;
int pflag;
int dflag=0;
pflag=0;
if(para !=0)//0进程不被删除;
{
for(p=plink;p;p=p->next)
{
if(p->node->pid == para )//找到要删除进程的结点p;
{
pflag=1;
break;
}
}
if(!pflag)
{
printf("pid %d is not exist!\n",para);
}
else
{
if(p->node->state == 1)//终止进程在执行
{
p->node->state=MAX;
p->node->dflag=1;
//调用新的进程
}
while(p->sub)
{
terminatepc(p->sub->node->pid);//终止子进程
}
if(p->node->dflag == 1) //如果进程或其子进程是当前执行进程,则重新调用执行进程,以优先权为准
{
int statetemp = plink->node->prio;
for(p3=plink;p3;p3=p3->next)
{
if(p3 != p)
if(statetemp > p3->node->prio )
{
statetemp = p3->node->prio;
p2=p3;
}
}
p2->node->state=1;
}
//删除进程结点
for(p1=plink;p1;p1=p1->next)//删除进程链表plink中进程结点
{
if(p1->next == p)
{
p1->next=p->next;
break;
}
}
for(p1=plink;p1;p1=p1->next)//删除进程树中进程结点
{
if(p1->node->pid == p->node->ppid)
{
pp=p1; //找到父进程 pp;
if(pp->sub == p) //如果要删除的进程为父进程的第一个子进程
{
pp->sub=p->brother;
break;
}
else//否则
{
for( p2=pp->sub; p2; p2=p2->brother )
{
if( p2->brother == p )
{
p2->brother=p->brother;
break;
}
}
}
}
}
}
delete p;
}
else
{
printf("pid %d can not be canceled!\n",para);
}
}
//show process detail
void showdetail()
{
//add your code
pnode *p,*p1;
for(p=plink;p;p = p->next)
{
printf("%d(prio %d): ",p->node->pid,p->node->prio);
for(p1 = p->sub;p1;p1 = p1->brother)
{
printf("%d(prio %d) ",p1->node->pid,p1->node->prio);
}
printf("\n");
}
printf("\n");
for(p=plink;p;p = p->next)//根据进程优先级,确定进程状态
{
if(p->node->state == 1)
{
printf("curpid: %d(prio %d) ",p->node->pid,p->node->prio);
break;
}
}
printf("\n");
}
//don't change
void main()
{
initerror();//错误提示初始化
short cflag,pflag;
char cmdstr[32];
proot = new pnode;//根进程初始化
proot->node=new pcb;
proot->node->pid=0;
proot->node->ppid=-1;
proot->node->prio=10;
proot->node->state=1;
proot->next=NULL;
proot->sub=NULL;
proot->brother=NULL;
plink=proot;//根进程加入进程链表
for(;;)
{
cflag=0;
pflag=0;
printf("cmd:");
scanf("%s",cmdstr);
if(!strcmp(cmdstr,"exit")) //exit the programe
{
break;
}
if(!strcmp(cmdstr,"showdetail"))//显示进程树;
{
cflag = 1;
pflag = 1;
showdetail();
}
else
{
int *para;
char *s,*s1;
s = strstr(cmdstr,"createpc"); //create process
if(s)//创建新进程;
{
cflag=1;
para = (int *)malloc(3);//获得数组空间
//getparameter
s1 = substr(s,instr(s,'(')+1,strlen(s)-2);//获得括号内的字符串
//s1=strstr(s,"(");
para=strtoarray(s1);//将括号内的3个字符转换成整型数组
createpc(para);//调用创建进程函数
pflag=1;
}
s=strstr(cmdstr,"terminatepc");
if(s)
{
int *para1;
cflag=1;
s1= substr(s,instr(s,'(')+1,strlen(s)-2);
para1=strtoarray(s1);
terminatepc(para1[0]);
pflag=1;
}
}
if(!cflag)
{
geterror(0);
}
else if(!pflag)
{
geterror(1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -