实验6软中断信号及处理实验目的(1)加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;(2)了解并熟悉Linux系统中利用软中断信号实现进程通信的基本概念及方法;(3)熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数。实验准备及预习阅读讲义《附件7-软中断信号及处理》,了解Linux系统中利用软中断信号实现进程通信的基本概念及方法,熟悉Linux提供的有关系统调用函数/库函数:alarm()、kill()、signal()、sleep()、pause()。实验内容1、该示例涉及sleep、pause、alarm函数的使用,请观察程序运行结果,并回答:为什么运行结果中没有最后一个printf语句的输入内容?#includeunistd.h#includestdio.h#includestdlib.hintmain(){intret;alarm(50);sleep(30);/*使进程睡眠30秒,期间要放弃CPU*/ret=alarm(10);printf(%d\n,ret);pause();/*使调用进程挂起直至捕捉到一个信号*/printf(Ihavebeenwakenup.\n,ret);}2、示例程序段中父进程通过kill()向子进程发送信号,请体会该函数的使用。#includesys/types.h#includesys/stat.h#includesignal.h#includeunistd.h#includestdio.h#includestdlib.hintmain(){pid_tpid;pid=fork();if(pid0){perror(fork()error\n);}if(pid==0){/*子进程*/printf(childprocesswaitforsignal!\n);pause();/*使调用进程挂起,直至捕捉到一个信号*/}else{/*父进程*/sleep(3);kill(pid,SIGKILL);/*向子进程发送SIGKILL信号*/printf(parentprocesssendsignaltokillchildprocess!\n);waitpid(pid,NULL,0);/*等待pid退出*/printf(childprocessexit!\n);exit(0);}}3、实验题1中,定时器产生信号SIGALRM、程序接收到到信号SIGALRM后,未指定对该信号的处理方法,而是采用了默认处理。请利用signal()函数捕捉信号,捕捉到信号后显示信息“Getanalarmsignal!”。请观察定义了信号处理函数后程序运行的输出结果。4、下面给出一个软中断信号使用的程序实现例:使用系统调用fork()创建两个子进程,再使用系统调用signal()让父进程捕捉键盘上来的中断信号(即按下Ctrl-C键);捕捉到中断信号后父进程用系统调用kill()向两个子进程发出终止信号,子进程捕捉到终止信号后输出“childprocessniskilledbyparent!”并终止。父进程等待两个子进程终止后,输出如下信息后结束运行:“parentprocessiskilled!”。请调试程序,分析程序的执行流程。#includeunistd.h#includestdio.h#includesignal.hvoidwaiting();voidstop();voidkeep_alive();intwait_mark;main(){intp1,p2;while((p1=fork())==-1);if(p10){while((p2=fork())==-1);if(p20){printf(“parent\n”);wait_mark=1;signal(SIGINT,stop);/*接收中断信号Ctrl-C*/waiting();kill(p1,SIGINT);kill(p2,SIGINT);wait(0);wait(0);printf(“parentprocessiskilledchildrenandexit!\n”);exit(0);}else{printf(“p2\n”);//wait_mark=1;signal(SIGINT,keep_alive);pause();printf(“childprocess2iskilledbyparent!\n”);exit(0);}}else{printf(“p1\n”);//wait_mark=1;signal(SIGINT,keep_alive);pause();printf(“childprocess1iskilledbyparent!\n”);exit(0);}}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}voidkeep_alive(){}