实验目的
了解Linux软中断(Signal)的工作原理。在Linux上使用C语言编写一个包含信号处理机制的程序,在该程序中可以安装自己的信号处理程序;在此基础上发送一个对应的信号,验证自己安装的信号处理程序是否被正常执行,从而加深对信号处理机制的理解。
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void sig_handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
// 安装信号处理程序
signal(SIGINT, sig_handler);// sighandler_t signal(int signum, sighandler_t handler)
/*handler 表示信号的处理方式,有三种情况:SIG_IGN:忽略参数signum所指的信号;一个自定义的处理信号的函数名,信号的编号为这个自定义函数的参数;SIG_DFL:恢复参数signum所指信号的处理方法为默认值。*/
//signum 表示信号的编号,SIGINT对应键盘中断 ctrl + c
pid_t pid=getpid();
printf("Program is running...\n");
sleep(10);
//参数以秒为单位,等待一段时间继续执行,直到达到参数指定时间或是被信号所中断
printf("sent signal by kill\n");//kill方式发送信号
kill(pid,2);//函数原型int kill(pid_t pid, int sig)
/*pid>0 将信号传给进程号为pid 的进程,=0将信号传给和目前进程相同进程组的所有进程,发送信号者进程也会收到自己发出的信号。=−1 将信号广播传送给系统内所有的进程。*/
//sig 为准备发送的信号代码。SIGINT的整数值为2
//kill成功执行时,返回 0;失败时返回-1。
printf("Program is exiting...\n");
return 0;
}
实验截图,按下ctrl c
说明:按下ctrl+c时,信号处理程序执行,打印出了SIGINT对应的信号编码2,接着kill函数向当前进程发送SIGINT信号,再次执行信号处理程序,打印出了SIGINT对应的信号编码2。