实验三进程管理及进程通信实验环境:Linux操作系统实验目的:(1)利用Linux提供的系统调用设计程序,加深对进程概念的理解。(2)体会系统进程调度的方法和效果。(3)了解进程之间的通信方式以及各种通信方式的使用。实验方法:用vi编写c程序(假定程序文件名为prog1.c)编译程序$gcc-oprog1.oprog1.c或$cc-oprog1.oprog1.c运行$./prog1.o实验内容及步骤:实验1编写程序。显示进程的有关标识(进程标识、组标识、用户标识等)。经过5秒钟后,执行另一个程序,最后按用户指示(如:Y/N)结束操作。编程截图:运行结果:实验2参考例程1,编写程序。实现父进程创建一个子进程。体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的方法。例程1:利用fork()创建子进程/*用fork()系统调用创建子进程的例子*/main(){inti;if(fork())/*父进程执行的程序段*/i=wait();/*等待子进程结束*/{printf("Itisparentprocess.\n");printf("Thechildprocess,IDnumber%d,isfinished.\n",i);}else{Printf(“Itischildprocess.\n”);Sleep(10);Exit();}}运行结果:思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fock()函数创建形成的,通过exit()函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程所有文件。实验3参考例程2,编写程序。父进程通过循环语句创建若干子进程。探讨进程的家族树以及子进程继承父进程的资源的关系。例程2:循环调用fork()创建多个子进程。/*建立进程树*/#includemain(){inti;printf(“Mypidis%d,myfather’spidis%d\n”,getpid(),getppid());for(i=0;i<3;i++)if(fork()==0)printf(“%dpid=%dppid=%d\n”,i,getpid(),getppid());else{j=wait(0);Printf(“%d:Thechile%disfinished.\n”,getpid(),j);}}运行结果:思考:①画出进程的家族树。答:进程家族树实验4参考例程3编程,使用fork()和exec()等系统调用创建三个子进程。子进程分别启动不同程序,并结束。反复执行该程序,观察运行结果,结束的先后,看是否有不同次序。例程3:创建子进程并用execlp()系统调用执行程序的实验/*创建子进程,子进程启动其它程序*/#include#include18341835183918411836183718381840main(){intchild_pid1,child_pid2,child_pid3;intpid,status;setbuf(stdout,NULL);child_pid1=fork();/*创建子进程1*/if(child_pid1==0){execlp("echo","echo","childprocess1",(char*)0);/*子进程1启动其它程序*/perror("exec1error.\n");exit(1);}child_pid2=fork();/*创建子进程2*/if(child_pid2==0){execlp("date","date",(char*)0);/*子进程2启动其它程序*/perror("exec2error.\n");exit(2);}child_pid3=fork();/*创建子进程3*/if(child_pid3==0){execlp("ls","ls",(char*)0);/*子进程3启动其它程序*/perror("exec3error.\n");exit(3);}puts("Parentprocessiswaitingforchileprocessreturn!");while((pid=wait(&status))!=-1)/*等待子进程结束*/{if(child_pid1==pid)/*若子进程1结束*/printf("childprocess1terminatedwithstatus%d\n",(status>>8));else{if(child_pid2==pid)/*若子进程2结束*/printf("childprocess2terminatedwithstatus%d\n",(status>>8));else{if(child_pid3==pid)/*若子进程3结束*/printf("childprocess3terminatedwithstatus%d\n",(status>>8));}}}puts("Allchildprocessesterminated.");puts("Parentprocessterminated.");exit(0);}运行结果:思考:子进程运行其它程序后,进程运行环境怎样变化的?反复运行此程序看会有什么情况?解释一下。答:子进程运行其他程序后,这个进程就完全被新程序替代。由于并没有产生新进程,所以进程标识号不变,除此之外的旧进程的其他信息,代码段,数据段,栈段等均被新程序的信息所替代。新程序从自己的main()函数开始进行。反复运行此程序发现结束的先后次序是不可预知的,每次运行的结果不一样。原因是当每个子进程运行其他程序是,他们的结束随着其他程...