linux信号作用解析

大耗子 2020年03月16日 281次浏览

文章链接:https://codemouse.online/archives/2020-03-16181245

查看支持的信号列表

  • 运行如下命令:

    codemouse@codemouse:~$ 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 ~ 31的信号为传统UNIX支持的信号。

  • 可靠信号(实时信号)
    编号为32 ~ 63的信号是后来扩充的。

  • 区别:
    不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

信号功能(小于SIGRTMIN的信号)

  1. SIGHUP

    控制台挂起或者控制台死亡时发出信号.
    不过wget是一个例外,它能捕获SIGHUP信号,关掉控制端wget也能继续下载。

  2. SIGINT

    程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出.

  3. SIGQUIT

    和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制.

  4. SIGILL

    执行了非法指令.

  5. SIGTRAP

    由断点指令或其它trap指令产生. 由debugger使用。

  6. SIGABRT

    调用abort函数生成的信号。

  7. SIGBUS

    访问了非法地址,指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。

  8. SIGFPE

    浮点错误。例如除零错误。

  9. SIGKILL

    用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。

  10. SIGUSR1

    留给用户使用

  11. SIGSEGV

    无效的内存引用,指针所对应的地址是无效地址,没有物理内存对应该地址。

  12. SIGUSR2

    留给用户使用

  13. SIGPIPE

    管道破裂。往管道写,没有读的一端。

  14. SIGALRM

    时钟定时信号。使用的是实际时间。

  15. SIGTERM

    终止信号, 与SIGKILL不同的是该信号可以被阻塞和处理。kill命令默认使用该信号。

  16. SIGCHLD

    子进程已停止或终止时,出现该信号提醒父进程。(父进程先终止,这时子进程的终止自动由init进程来接管)。

  17. SIGCONT

    如果停止则继续。例如ctrl+z后,程序停止,使用fg命令使进程继续。

  18. SIGSTOP

    停止(stopped)进程的执行,不可捕获。 程序未死亡,可以继续。

  19. SIGTSTP

    停止进程的运行, 该信号可以被处理和忽略. Ctrl-Z发出这个信号

  20. SIGTTIN

    后台处理终端输入(Terminal input for background process)。

  21. SIGTTOU

    后台处理终端输出(Terminal output for background process)。

  22. SIGURG

    有"紧急"数据到达socket时产生.

  23. SIGXCPU

    超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。

  24. SIGXFSZ

    超过文件大小资源限制。

  25. SIGVTALRM

    虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

  26. SIGPROF

    类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

  27. SIGWINCH

    窗口大小改变。

  28. SIGIO

    文件描述符准备就绪。(I/O now possible)

  29. SIGPWR

    Power failure

  30. SIGSYS

    程序的错误参数,非法的系统调用。

查看官方文档

codemouse@codemouse:~$ man 7 signal

信号分类

  • 程序不可捕获、阻塞或忽略的信号有:

    SIGKILL,SIGSTOP

  • 不能恢复至默认动作的信号有:

    SIGILL,SIGTRAP

  • 默认会导致进程流产的信号有:

    SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT
    SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ

  • 默认会导致进程退出的信号有:

    SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE
    SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1
    SIGUSR2,SIGVTALRM

  • 默认会导致进程停止的信号有:

    SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU

  • 默认进程忽略的信号有:

    SIGCHLD,SIGPWR,SIGURG,SIGWINCH