1武汉工程大学实验报告专业班级:网工01姓名:何彬学号:1305120411课程名称:操作系统实验成绩:指导教师:蔡敦波实验名称:进程控制与进程间通信一、实验目的:1、掌握进程的概念,明确进程和程序的区别。2、认识和了解并发执行的实质。3、了解什么是信号。4、熟悉LINUX系统中进程之间软中断通信的基本原理。二、实验内容:1、进程的创建(必做题)编写一段程序,使用系统调用fork()创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。参考程序2运行的结果是bca.首先创建进程p1,向子进程返回0,输出b.又创建进程p2,向子进程返回0,输出c,同时向父进程返回子进程的pid,输出a2、修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。(必做题)参考程序#includestdio.hintmain(){intp1,p2,i;while((p1=fork())==-1);if(p1==0)for(i=0;i500;i++)printf(“child%d\n”,i);else{while((p2=fork())==-1);If(p2==0)for(i=0;i500;i++)printf(“son%d\n”,i);elsefor(i=0;i500;i++)printf(“daughter%d\n”,i);}}3运行的结果是如上图所示.首先创建进程p1,向子进程返回0,并for语句循环输出child+i字符串.又创建进程p2,向子进程返回0,输出字符串son+i,同时向父进程返回子进程的pid,输出字符串duaghter+i,各打印5次。43、编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。(选做题)实验一代码及结果图一进程树实验结果及相关代码a父进程子进程图1进程树bcdadbce图2进程树5图二进程树实验结果及相关代码4、编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程终止后,输出以下信息后终止:Parentprocessiskilled!参考程序#includestdio.h#includesignal.h#includeunistd.h#includesys/types:.h#includesys/wait.hintwait_mark;voidwaiting(),stop();voidmain(){intp1,p2;signal(SIGINT,stop);while((p1=fork())==-1);if(p10)/*在父进程中*/{①while((p2=fork())==-1);If(p20)/*在父进程中*/{②6wait_mark=1;waiting(0);kill(p1,10);kill(p2,12);wait();wait();printf(parentprocessiskilled!\n);exit(0);}else/*在子进程2中*/{wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf(childprocess2iskilledbyparent!\n);lockf(1,0,0);exit(0);}}else/*在子进程1中*/{wait_mark=1;signal(10,stop);waiting();lockf(1,1,0);printf(childprocess1iskilledbyparent!\n);lockf(1,0,0);exit(0);}}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}实验要求:⑴、运行程序并分析结果。7中断后,父进程收到子进程退出状态,依次杀死子进程2子进程1,等待子进程完全退出后,杀死父进程⑵、如果把signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。改变signal(SIGINT,stop)的位置后发现,只是杀死了子进程2和父进程,而子进程1没有被杀死。是因为子进程1没有设置对信号的处理操作,则键盘中断时,仍然无法将其杀死。⑶、该程序段前面部分用了两个wait(0),为什么?wait(0)是为了让前面的子进程完全执行完,才可以进行下面的操作。⑷、该程序段中每个进程退出时都用了语句exit(0),为什么?首先是为了让进程退出,其次是向父进程返回退出时的状态;5、修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。参考程序#includestdio.h#includesignal.h#includeunistd.hmain(){intpid1,pid2;intEndFlag=0;Pf1=0;Pf2=0;voidIntDelete(){kill(pid1,10);kill(pid2,12);EndFlag=1;}8voidInt1(){printf(“childprocess1iskilledbyparent!\n”);exit(0);}voidInt2(){printf(“childprocess2iskilledbyparent!\n”);exit(0);}main(){intexitcode;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);while((pid1=fork())==-1);if(pid==0){signal(SIGUSER1,Int1);signal(SIGQUIT,SIG_IGN);pause();exit(0);}else{while((pid2=fork())==-1);if(pid2==0){signal(SIGUSER1,Int1);signal(SIGQUIT,SIG_IGN);pause();exit(0);}else{signal(SIGINT,IntDelete);waitpid(-1,&exitcode,0);printf(“parentprocessiskilled\n”);exit(0);}}}9实验要求:运行程序并分析结果。【思考题】1、系统是怎样创建进程的?系统通过调用fork()函数创建子进程2、当首次调用新创建进程时,其入口在哪里?入口应该是创建进程的PID3、当前运行的程序(主进程)的父进程是什么?当前运行程序的父进程是应该是该进程的上一个进程