📄 proces.cpp
字号:
#include "basic.h"
pnode *proot;
pnode *plink;
//create process
int createpc(int *para)
{
//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;
}
p1 = new pnode;
p1->node=new pcb;
p1->node->pid = para[0];
p1->node->ppid = para[1];
p1->node->prio = para[2];
p1->sub=NULL;
p1->next=NULL;
p1->brother=NULL;
//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;
}
//在plink中删除
void DelInPlink(pnode *p)
{ pnode *p1,*p2;
p1=plink;
while(p1)
{
p2=p1;p1=p1->next;
if(p1==p)
{ p2->next=p1->next;break;}
}
delete p;
}
//删除进程
void deletepc(int pro)
{
pnode *p ,*curp,*pp,*p1,*p2;
//查找当前进程
for(p=plink;p;p=p->next)
{
if(p->node->pid==pro)
{ curp=p; break;}
}
//查找当前进程的父进程
for(p=plink;p;p=p->next)
{
if(p->node->pid==curp->node->ppid)
{ pp=p;break;}
}
//当前进程与父进程脱离
if(curp->brother)
{
if(pp->sub==curp) //为父进程的长子进程时
pp->sub=curp->brother;
else //不是父进程的长子进程时
{
p1=pp->sub;
while(p1)
{
p2=p1;p1=p1->brother;
if(curp==p1)
{p2->brother=p1->brother;break;}
}
}
}
//当前进程的子进程
if(curp->sub)
{
p1=curp->sub;
while(p1)
{
p2=p1;p1=p1->brother;
deletepc(p2->node->pid);
}
}
//删除当前进程
p1=pp->sub;
while(p1)
{
p2=p1;p1=p1->brother;
if(curp==p1)
{p2->brother=p1->brother;break;}
}
DelInPlink(curp);
}
//show process detail
void showdetail()
{
//add your code
pnode *p,*p1;
p=plink;
for(;p;)
{
printf("%d(prio %d): ",p->node->pid,p->node->prio);
p1 = p->sub;
for(;p1;)
{
printf("%d(prio %d) ",p1->node->pid,p1->node->prio);
p1 = p1->brother;
}
printf("\n");
p = p->next;
}
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=0;
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);
createpc(para);
pflag=1;
}
else{
s = strstr(cmdstr,"deletepc");
if (s){
cflag = 1;
s1 = substr(s,instr(s,'(')+1,strlen(s)-2);
deletepc(atoi(s1));
pflag = 1;
}
}
}
if(!cflag)
geterror(0);
else if(!pflag)
geterror(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -