⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proces.cpp

📁 进程创建与撤消模拟实现
💻 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 + -