1 实验目的
- 理解Linux的信号机制
- 学会编写信号发送和信号处理程序
2 背景知识
信号处理是linux程序的一个特色。用信号处理来模拟操作系统的中断功能。要想使用信号处理功能,你要做的就是填写一个信号处理函数即可。
要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。
Linux的信号处理函数如下:
- kill 发送信号SIGKILL给指定的进程或进程组
- raise 发送信号给进程或自身
- alarm 定时器信号设置,定时器时间到,会发送SIGALARM信号
- pause 等待信号,在信号来之前进程一直挂起
- signal 捕捉信号的函数
3实验内容
1、编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(按^c 键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息,然后终止:
child process1 is killed by parent!
child process2 is killed by parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
parent process is killed!
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
int wait_mark;
void waiting()
{
while(wait_mark==1);
}
void stop()
{
wait_mark=0;
}
int main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(16,stop);
waiting();
printf("Child Process11 is killed by parent!\n");
exit(0);
}
else
{
while((p2=fork())==-1)
if(p2==0)
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(17,stop);
waiting();
printf("Child Process12 is killed by parent!\n");
exit(0);
}
else
{
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("Parent Process is killed!\n");
exit(0);
}
}
}
分析:程序开始调用fork()函数创建两个子进程,初始时两个子进程处于等待状态,再调用singal()函数让父进程捕捉键盘上来的中断信号(即按Ctrl+c键);当父进程捕捉到从键盘上传来的中断信号后,父进程调用Kill()函数向两个子进程发出信号,该信号的作用是让子进程从等待状态转为执行状态,子进程捕捉到该信号后分别执行各自的程序。