实验目的
1、了解什么是信号
2、熟悉LINUX系统中进程之间软中断通信的基本原理
实验内容
编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is killed!
实验过程
一、信号
1、信号的基本概念
每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件
信号机制具有以下三方面的功能:
(1)发送信号。发送信号的程序用系统调用kill( )实现;
(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。
二、所涉及的中断调用
1、kill( )
系统调用格式
int kill(pid,sig)
参数定义
int pid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
2、signal( )
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式
signal(sig,function)
头文件为
#include
参数定义
signal(sig,function)
int sig;
void (*func) ( )
其中sig用于指定信号的类型,function:在该进程中的一个函数地址
三、参考程序
#include#include #include void waiting( ),stop( ); int wait_mark; main( ) { int p1,p2,stdout; while((p1=fork( ))= =-1); if (p1>0) { while((p2=fork( ))= =-1); if(p2>0) { wait_mark=1; signal(SIGINT,8。vstop); waiting( ); kill(p1,16); kill(p2,17); wait(0); wait(0); printf("Parent process is killed!n"); exit(0); } else { wait_mark=1; signal(17,stop); 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); 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; }
实际运行结果:
Child process1 is killed by parent!
Child process2 is killed by parent!
四、理论运行结果
屏幕上无反应,按下^C后,显示
Child process1 is killed by parent!
Child process2 is killed by parent!
Parent process is killed!



