目录
1、信号
A发送给B信号,B收到信号后,必须暂停运行,先处理信号,处理完再回来继续执行。类似中断,称为“软中断”。信号简单、不能携带大量信息。所有信号都是由内核负责发送的,也是由内核负责处理的。
2、信号产生
(1)按键产生:Ctrl+c、Ctrl+z、Ctrl+\
(2)命令产生:kill命令
(3)系统调用产生:kill、about、raise
(4)软件条件产生:定时器sleep()、alarm
(5)硬件异常产生:非法内存访问(段错误)、除0、内存对齐出错(总线错误)
3、信号状态
(1)未决:信号刚产生后,没有到达进程;或者由于阻塞(屏蔽),导致信号不能到达进程,一直处于未决。
(2)递达:发送并且到达进程。
4、信号处理
(1)执行默认动作
(2)忽略(丢弃)
(3)捕捉(调用用户处理函数)
5、pcb中的信号集
(1)未决信号集:位于进程pcb,一旦某信号产生,对应标志位立即翻转为1,当信号送达进程,立即翻转为0。
(2)阻塞信号集(信号屏蔽字):当信号对应的阻塞信号集标志位为1时,信号一直处于未决状态。
6、查看信号表
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1 - 33 常规信号,都有默认动作
34 - 64 实时信号,没有默认动作,一般作为底层硬件驱动
7、信号四要素
编号、名称、事件、默认动作
查看帮助文档
man 7 signal
8、signal 函数
signal 不会阻塞,只起到了注册待捕捉信号行为的作用。
#include <signal.h>
typedef void (*sighandler_t)(int); // 回调函数
sighandler_t signal(int signum, sighandler_t handler); // 信号 + 回调
/*
The signals SIGKILL and SIGSTOP cannot be caught or ignored.
signal(signum, SIG_IGN); // 当信号到来时,忽略信号,什么也不做
signal(signum, SIG_DFL); // 当信号到来时,执行默认的操作
signal(signum, myhandler); // 当信号到来时,执行用户自己定义的操作
*/
9、sigaction 函数
#include <signal.h>
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int); // 回调函数
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask; // mask 的信号不能打断当前正在信号正在执行的处理
int sa_flags; // 0 表示当前执行不被其他信号打断
void (*sa_restorer)(void);
};
/*
signum specifies the signal and can be any valid signal except SIGKILL and SIGSTOP
*/
void myhandler(int signum){
//xxx
}
struct sigaction act, oldact;
act.sa_handler = myhandler;
act.sa_mask = 0;
act.sa_flags = 0;
sigaction(signum, &act, &oldact);