1.在linux用命令 kill -l 查看系统信号
2.前32个信号是unix经典信号,后32为实时信号(自定义信号)
3.前台进程永远只有一个,后台进程可以有n个
4 用用命令ctl+c 可以结束唯一一个后台进程
5.产生信号的几种方式
1)终端组合按键产生信号 (ctl+c (15 SIGTERM) ctl+\(3 SIGQUIT) ctl+z(20 SIGTSTP))
2)命令函数产生信号 kill() raise() abort() 产生信号
kill()向任意进程发送信号
raise()向自己进程发送信号
abort()向自己发送SIGABORT信号
3)硬件异常产生信号
段错误(非法操作内存)SIGSEV
浮点数例外(非法运算)SIGFPE
4) 软条件产生信号
例如匿名管道(读端关闭,写端向管道内写数据,内核向写端发送SIGPIPE信号,导致写进程终止)
alarm()定时器向内核发送当前进程发送SIGALRM信号
信号的传递过程:
注意:unix经典信号不支持排队,但是实际上最多支持一次排队(因为内核可帮助设置临时屏蔽字)
自定义信号支出排队
临时屏蔽字的作用:为了避免在处理信号的自定义动作干扰,当执行完捕捉动作后,该屏蔽解除
屏蔽字的三种设置方式:
SIG_SETMASK
SIG_BIOCK
SIG_UNBLOCK
问:信号的捕捉是实时得到吗? 不是
信号捕捉的执行过程:
1.在程序出现异常,中断,系统调用,从内核空间切换到用户空间
2.在处理完异常调用和中断之后,回到用户空间之前,检测是否存在未处理的信号
3.内核执行捕捉函数
4.sig_return(内核返回内核空间)
5.sig_sigreturn(执行在主函数中断·位置以下的部分)