3.1信号机制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档