Linux 信号
信号概念
信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。
应用程序收到信号后,有三种处理方式:
忽略
默认
捕捉
进程收到一个信号后,会检查对该信号的处理机制。
如果是SIG_IGN,就忽略该信号;
如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;
如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。
信号来源
信号是传送给进程的一种事件通知,生成信号的事件有三大类:
1、程序错误:除零,非法内存访问...
2、外部信号:终端Ctrl-C产生SGINT信号, Ctrl-\,产生SGQUIT信号,定时器到期产生SIGALRM等
3、外部程序:kill函的数允许进程发送任何信号给其他进程或进程组。
Linux/i386中的部分信号
信号举例:“Ctrl+c”组合键
假设用户在console下按下“ctrl+c”,这将产生终端中断
tty驱动程序能识别出这个组合键,并向自己的前台进程发送一个SIGINT信号。
当对应进程被调度执行时,它将在上下文切换返回到用户态时检查到这个信号。
此外,通常前台进程就是被ctrl+c中断的current进程。当进程从中断返回时,也会检查到这个信号。
检查到信号后,系统就会让进程执行相应的动作。
Linux通信所使用信号可由命令man 7 signal来查询。
例如:
#include <signal.h> #include <stdio.h> static void sig_func(int); main() { if(signal(SIGINT,sig_func)==SIG_ERR) perror("Can't Catch SIGINT"); for(;;); } static void sig_func(int signo) { printf("Rcvd sig %d\n",signo); }
与信号相关的系统调用