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

📄 terminate.cpp

📁 操作系统中 进程撤销试验模拟 开发环境c语言
💻 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 + -