浅谈Linux 信号(Signal)

1.在linux用命令 kill -l 查看系统信号

2.前32个信号是unix经典信号,后32为实时信号(自定义信号)

3.前台进程永远只有一个,后台进程可以有n个

4 用用命令ctl+c 可以结束唯一一个后台进程

浅谈Linux 信号(Signal)_第1张图片

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信号

信号的传递过程:

浅谈Linux 信号(Signal)_第2张图片

注意:unix经典信号不支持排队,但是实际上最多支持一次排队(因为内核可帮助设置临时屏蔽字)

        自定义信号支出排队

临时屏蔽字的作用:为了避免在处理信号的自定义动作干扰,当执行完捕捉动作后,该屏蔽解除

屏蔽字的三种设置方式:

        SIG_SETMASK

        SIG_BIOCK

        SIG_UNBLOCK

浅谈Linux 信号(Signal)_第3张图片

问:信号的捕捉是实时得到吗?  不是

信号捕捉的执行过程:

   1.在程序出现异常,中断,系统调用,从内核空间切换到用户空间

    2.在处理完异常调用和中断之后,回到用户空间之前,检测是否存在未处理的信号

    3.内核执行捕捉函数

     4.sig_return(内核返回内核空间)

     5.sig_sigreturn(执行在主函数中断·位置以下的部分)



你可能感兴趣的:(Linux)