3.1信号机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三进程间通信
(一)信号机制实验
一、实验目的与要求
1.目的
(1)了解什么是信号。
(2)熟悉LINUX系统中进程之间软中断通信的基本原理。
2.要求
了解和熟悉LINUX支持的信号量机制。
二、实验环境
1.硬件
2.软件
Ubuntu linux 9.04
三.实验内容
(1)编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!
(2)分析利用软中断通信实现进程同步的机理。
四、回答相关问题
(1)该程序段前面部分用了两个wait(0),它们起什么作用?
答:该程序段前面部分用的两个wait(0)是为了让父进程等待子进程结束后再结束自己,在此过程中,父进程处于挂起状态。
(2)该程序段中每个进程退出时都用了语句exit(0),为什么?
答:用exit(0)是为了让子进程自我终止,正常退出。
(3)为何预期的结果并未显示出?
答:p1、p2都会捕捉该中断信号。对于父进程,当它捕捉到中断信号后就会转向程序中指定的函数“stop()”,当“stop()”执行完毕后,父进程被唤醒,从中断处继
续运行。对于子进程,由于没有给它们指定收到中断信号后的动作,它们会在捕
捉到中断信号后执行默认操作,即结束自己。所以当我们发出中断信号后,父进
程按预计方式正常执行,而p1、p2就被自己结束了,从而也就不会有预计的结
果了。
(4)程序该如何修改才能得到正确结果?
答:为了使程序运行得到正确的结果,可以在每个子进程程序段开头加上忽略“^C”
中断信号的语句,即:signal(SIGINT,SIG_IGN)。
(5)不修改程序如何得到期望的输出?
答:在不修改程序的情况下要输出期望的结果,可以单独向发进程发送SIGINT信号这样既可避免子进程由于收到SIGINT信号执行默认操作而自我终止。
五、调试过程
六.心得体会
通过信号机制实验,我知道了信号与中断的相似点:采用了相同的异步通信方式;当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;都在处理完毕后返回到原来的断点;对信号或中断都可进行屏蔽。信号与中断的区别:中断有优先级,而信号没有优先级,所有的信号都是平等的;信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;中断响应是及时的,而信号响应通常都有较大的时间延迟。七.实验代码如下:
#include
#include
#include
void waiting( ),stop( );
int wait_mark;
main( )
{
int p1,p2,stdout;
while((p1=fork( ))= =-1); /*创建子进程p1*/
if (p1>0)
{
while((p2=fork( ))= =-1); /*创建子进程p2*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转stop*/
waiting( );
kill(p1,16); /*向p1发软中断信号16*/
kill(p2,17); /*向p2发软中断信号17*/
wait(0); /*同步*/
wait(0);
printf("Parent process is killed!\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop); /*接收到软中断信号17,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop); /*接收到软中断信号16,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
void waiting( )
{
while(wait_mark!=0);
}
void stop( )
{
wait_mark=0;
}