操作系统实验报告课程名称操作系统班级物联网一班名姓号学实验名称进程间的通信实验序号31.实验目的及要求①了解什么是信号。②熟悉LINUX系统中进程之间软中断通信的基本原理。2.实验环境VMwareWorkstation12Player3.实验内容①编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程终止后,输出以下信息后终止:Parentprocessiskilled!②程序实例#include#include#includeintwait_mark;voidwaiting();voidstop();voidmain(){intp1,p2;signal(SIGINT,stop);//signal()初始位置while((p1=fork())==-1);if(p1>0){signal(SIGINT,stop);while((p2=fork())==-1);if(p2>0){signal(SIGINT,stop);wait_mark=1;waiting();kill(p1,10);kill(p2,12);wait();wait();printf(parentprocessiskilled!\n);exit(0);}else{wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf(childprocess1iskilledbyparent!\n);lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(10,stop);waiting();lockf(1,1,0);printf(childprocess2iskilledbyparent!\n);lockf(1,0,0);exit(0);}}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}③程序结果以及分析分析:程序执行时,首先会先在父程序中创建一个子程序,然后父程序向子程序发送一个信号(kill方法),子进程在接收到父程序发送的信号后,会在控制台打印一句话,这时因为有两个子进程接收到信号,他们都要对控制台操作,这时会发生互斥操作。lockf(1,1,0);printf(childprocess2iskilledbyparent!\n);lockf(1,0,0);再打印后子程是分别加锁和解锁操作,lockf(1,0,0)和lockf(1,1,0).序会退出。在程序中加入wait()是等待两个程序都结束了父程序在控制台打印输出。exit(0)的作用是退出子程序。④修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。⑤示例程序#include#include#includevoidIntDelete();voidInt1();voidInt2();intpid1,pid2;intEndFlag=0;voidmain(){intexitcode;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);while((pid1=fork())==-1);if(pid1==0){signal(SIGUSR1,Int1);signal(SIGINT,SIG_IGN);pause();}else{while((pid2=fork())==-1);if(pid2==0){signal(SIGUSR2,Int2);signal(SIGINT,SIG_IGN);pause();}else{signal(SIGINT,IntDelete);waitpid(-1,&exitcode,0);printf(parentprocessiskilled\n);}}}voidIntDelete(){kill(pid1,10);kill(pid2,12);EndFlag=1;}voidInt1(){printf(childprocess1iskilledbyparent!\n);exit(0);}voidInt2(){printf(childprocess2iskilledbyparent!\n);exit(0);}⑥程序分析1.首先在主进程中创建一个子进程1,并将自定义中断信号挂起并监听中断信1上去,子进程Int1()注册到函数SIGUSR1.号,当接收到中断信号子进程1会打印一句话并退出;2.父进程还会创建一个子进程2,并将自定义中断信号SIGUSR2注册到函数Int2()上去,子进程2挂起并监听中断信号,当接收到中断信号子进程2会打印一句话并退出;3.父进程将中断信号SIGINT上注册到了IntDelete函数上,当父进程接收到中断后,会向两个子进程发送软中断信号,子进程接收到软中断信号后会执行响应的响应;以下是截图:4.实验问题从执行结果上来看,按照程序执行的顺序是父进程先接收到中断信号那么为什么父进程反而最后打印输出?这是因为pid_twaitpid(pid_tpid,int*status,intoptions);pid=-1等待任何子进程,相当于wait()。5.实验总结通过本次试验学习了解到进程如何接受中断信号,以及发出软中断信号,以及进程间的等待问题。.