Linux系统编程 100 信号四要素和常规信号一览

信号的编号
可以使用kill -l 命令查看当前系统可使用的信号有哪些

$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    


不存在编号为0的信号。其中 1-31号信号称之为常规信号(也叫普通信号),
34-64之间的信号称之为实时信号,驱动编程于硬件相关。名字上区别不大,
而前面32个名字各不相同。

常规信号和实时信号的区别:


所有的常规信号都有它所对应的默认事件和处理动作。
而实时信号它没有默认事件

实时信号也不在应用开发程序中使用。
一般是在驱动底层开发的时候会用到。

我们现在只需要掌握前面的常规信号即可。

常规信号需要结合信号四要素去了解它们。

信号四要素

好比变量三要素
1.变量类型
2.变量名
3.变量值

信号使用之前,先确定信号四要素之后,再用
信号四要素:
1.编号
2.名称
3.信号对应的事件         (容易忽略)
4.默认处理动作 (容易忽略,内核处理)


可通过man 7 signal查看帮助文档

SIGNAL(7)                  Linux Programmer's Manual                 SIGNAL(7)

NAME
       signal - overview of signals

DESCRIPTION
       Linux  supports both POSIX reliable signals (hereinafter "standard sig‐
       nals") and POSIX real-time signals.

   Signal dispositions
       Each signal has a current disposition, which determines how the process
       behaves when it is delivered the signal.

       The  entries  in  the  "Action"  column of the tables below specify the
       default disposition for each signal, as follows:

       Term   Default action is to terminate the process.

       Ign    Default action is to ignore the signal.

       Core   Default action is to terminate the process and  dump  core  (see
              core(5)).

 Manual page signal(7) line 1 (press h for help or q to quit)


   

First the signals described in the original POSIX.1-1990 standard.

       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process

       The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.


       
       

Next  the  signals  not  in  the POSIX.1-1990 standard but described in
       SUSv2 and POSIX.1-2001.

       Signal       Value     Action   Comment
       ────────────────────────────────────────────────────────────────────
       SIGBUS      10,7,10     Core    Bus error (bad memory access)
       SIGPOLL                 Term    Pollable event (Sys V).
                                       Synonym for SIGIO
       SIGPROF     27,27,29    Term    Profiling timer expired
       SIGSYS      12,31,12    Core    Bad argument to routine (SVr4)
       SIGTRAP        5        Core    Trace/breakpoint trap
       SIGURG      16,23,21    Ign     Urgent condition on socket (4.2BSD)
       SIGVTALRM   26,26,28    Term    Virtual alarm clock (4.2BSD)
       SIGXCPU     24,24,30    Core    CPU time limit exceeded (4.2BSD)
       SIGXFSZ     25,25,31    Core    File size limit exceeded (4.2BSD)

       Up to and including Linux 2.2, the default behavior for  SIGSYS,  SIGX‐
       CPU,  SIGXFSZ,  and (on architectures other than SPARC and MIPS) SIGBUS
       was to terminate the process (without a core  dump).   (On  some  other
       UNIX systems the default action for SIGXCPU and SIGXFSZ is to terminate
       the  process  without  a  core  dump.)   Linux  2.4  conforms  to   the
       POSIX.1-2001  requirements  for  these signals, terminating the process
       with a core dump.

 

      Next various other signals.

       Signal       Value     Action   Comment
       ────────────────────────────────────────────────────────────────────
       SIGIOT         6        Core    IOT trap. A synonym for SIGABRT
       SIGEMT       7,-,7      Term
       SIGSTKFLT    -,16,-     Term    Stack fault on coprocessor (unused)
       SIGIO       23,29,22    Term    I/O now possible (4.2BSD)
       SIGCLD       -,-,18     Ign     A synonym for SIGCHLD
       SIGPWR      29,30,19    Term    Power failure (System V)
       SIGINFO      29,-,-             A synonym for SIGPWR
       SIGLOST      -,-,-      Term    File lock lost (unused)
       SIGWINCH    28,28,20    Ign     Window resize signal (4.3BSD, Sun)
       SIGUNUSED    -,31,-     Core    Synonymous with SIGSYS

       (Signal 29 is SIGINFO / SIGPWR on an alpha but SIGLOST on a sparc.)

       SIGEMT is not specified in POSIX.1-2001, but  nevertheless  appears  on
       most  other UNIX systems, where its default action is typically to ter‐
       minate the process with a core dump.

       SIGPWR (which is not specified in POSIX.1-2001) is typically ignored by
       default on those other UNIX systems where it appears.

       SIGIO (which is not specified in POSIX.1-2001) is ignored by default on
       several other UNIX systems.

       Where defined, SIGUNUSED is synonymous with SIGSYS  on  most  architec‐
       tures.

为什么出现下面的情况:

 SIGUSR1   30,10,16    Term    User-defined signal 1
 

(Where three values are given, the first one is usually valid for alpha
and sparc, the middle one for x86, arm, and most  other  architectures,
and  the  last one for mips.  (Values for parisc are not shown; see the
Linux kernel source for signal numbering on that  architecture.)   A  -
denotes that a signal is absent on the corresponding architecture.)


分不同的操作系统,值是不一样的


第一个是 alpha and sparc  
(alpha :摩托摩拉公司 贝尔实验室 苹果公司 共同开发出来的,被收购后在苹果旗下)
(sparc:SUN和TI公司)
第二个是 x86 arm 或者其他的架构
第三个是 mips 芯片

不同的操作系统,值是不一样的,但是名字是一样的。
所以写的时候,推荐使用名字去写。

Linux常规信号一览表

1)SIGHUP:本信号在用户终端结束时发出,通常是在终端的控制进程结束时,通知同一会话期内的各个作业,这时他们与控制终端不在关联。
          比如,登录Linux时,系统会自动分配给登录用户一个控制终端,在这个终端运行的所有程序,
          包括前台和后台进程组,一般都属于同一个会话。当用户退出时,所有进程组都将收到该信号,
          这个信号的默认操作是终止进程。此外对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
          简短描述:
          当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作是终止进程
          比如由终端启动起来的进程,统一发送SIGHUP信号
          PS: 进入shell的两种方式:A.进入Linux控制台  B.使用终端
          SIGHUP: Signal Hang Up (信号:挂机)
          
2)SIGINT:程序终止信号。当用户按下CRTL+C时通知前台进程组终止进程。
          补充:
          默认动作也是终止进程
          Signal: Interruption
         
          
3)SIGQUIT:Ctrl+\控制,进程收到该信号退出时会产生core文件,类似于程序错误信号。
          补充:
          用户终端向正在运行的由该终端启动的程序发出信号,默认动作是终止进程
4)SIGILL: 执行了非法指令。通常是因为可执行文件本身出现错误,或者数据段、堆栈溢出时也有可能产生这个信号。
          补充:
          CPU检测到某些进程执行了非法指令。默认动作为终止进程  产生 core 文件。应用程序当中应用的概率很小。
5)SIGTRAP:由断点指令或其他陷进指令产生,由调试器使用。
          补充:
          该信号由断点指令或其他trap指令产生。默认动作为终止进程  并产生core文件
          是gdb调试的时候,会产生的信号
         
6)SIGABRT:调用abort函数产生,将会使程序非正常结束。
          补充:
          默认动作为终止进程并产生core 文件。

7)SIGBUS: 非法地址。包括内存地址对齐出错。比如访问一个4个字长的整数,但其地址不是4的倍数。
          它与SIGSEGV的区别在于后者是由于对合法地址的非法访问触发。
8)SIGFPE:  发生致命的算术运算错误。
          补充:
          浮点数例外的错误,除0操作及溢出等所有的算法错误。
          默认动作为终止进程并产生core文件。
          SIGnal: Floating Point Exception”的缩写,意思是“信号:浮点异常”
          
9)SIGKILL:用来立即结束程序的运行。 (重点)
         补充:
         无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。
         它向系统管理员提供了可以杀死任何进程的方法。该信号,不能够被忽略。
         不能够被捕捉,只能够执行执行默认动作。
              
10)SIGUSR1:留给用户使用,用户可自定义。
         补充:
         用户定义的信号,即程序员可以在程序中,定义并使用该信号。默认动作是终止进程
11)SIGSEGV:访问未分配给用户的内存区。或操作没有权限的区域。
         补充:
         是段错误信号,提示进程进行无效内存访问。默认动作为终止进程并产生core文件(会把终止的原因写进core文件中去)。
         “SIGSEGV”是“SIGnal: SEGmentation Violation
12)SIGUSR2:留给用户使用,用户可自定义。
          补充:
          用户定义的信号,即程序员可以在程序中,定义并使用该信号。默认动作是终止进程

13)SIGPIPE:管道破裂信号。当对一个读进程已经运行结束的管道执行写操作时产生。
          补充:
          broken pipe向一个没有读端的管道写数据。默认动作为终止信号。
          
14)SIGALRM:时钟定时信号。由alarm函数设定的时间终止时产生。
          补充:
          定时器超时,超时的时间 由系统调用alarm设置。默认动作是终止信号。
          
15)SIGTERM:程序结束信号。shell使用kill产生该信号,当结束不了该进程,尝试使用SIGKILL信号。 
          补充:
          程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来表示程序正常退出。
          执行shell命令kill时,缺省产生这个信号。默认动作为终止信号。
          
16)SIGSTKFLT:堆栈错误。
          补充:
          Linux早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。
          SIGnal:STack Fault
          
17)SIGCHLD:子进程结束,父进程会收到。如果子进程结束时父进程不等待或不处理该信号,子进程会变成僵尸进程。
          补充:
          子进程状态发生变化,父进程会收到这个信号。默认动作为忽略这个信号。报信的人是内核。
18)SIGCONT:让一个停止的进程继续执行。
          补充:
          如果进程已经停止,则使其继续运行。默认动作为继续/忽略
          
19)SIGSTOP:暂停进程执行。暂停执行。
         补充:
         也是不能被忽略,处理和阻塞,只能执行默认动作,默认动作为暂停进程。
         
20)SIGTSTP:停止运行,可以被忽略。Ctrl+z。
         补充:
         默认动作为暂停进程。


         
后面的就相对没那么重要了。

21)SIGTTIN:当后台进程需要从终端接收数据时,所有进程会收到该信号,暂停执行。
         补充:
         默认动作是暂停进程
         SIGnal: TTY INput”的缩写
22)SIGTTOU:与SIGTTIN类似,但在写终端时产生。
         补充:
         默认动作是暂停进程
23)SIGURG:套接字上出现紧急情况时产生。
         补充:
         套接字上由紧急数据时,向当前正在进行的进程发出信号,报告有紧急数据到达。
         如网络带外数据到达,默认动作为忽略该信号。
         
24)SIGXCPU:超过CPU时间资源限制时产生的信号。
         补充:
         进程执行时间超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。
         默认动作为忽略该信号。
         
25)SIGXFSZ:当进程企图扩大文件以至于超过文件大小资源限制时产生。
         补充:
         超过文件的最大长度设置。默认动作为终止信号。
         
26)SIGVTALRM:虚拟使用信号。计算的是进程占用CPU调用的时间。
         补充:
         虚拟时钟超时时,产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。
         默认动作为终止进程。
             
27)SIGPROF:包括进程使用CPU的时间以及系统调用的时间。
         补充:
         默认动作是终止进程。
         
28)SIGWINCH:窗口大小改变时。
         补充:
         默认为忽略该进程。
         
29)SIGIO:文件描述符准备就绪,表示可以进行输入输出操作。
         补充:
         此信号向进程指示发出了一个异步IO事件。默认动作为忽略。
30)SIGPWR:电源失效信号。
         补充:
         关机。默认动作为终止进程
31)SIGSYS:非法的系统调用。
         补充:
         无效的系统调用。默认动作为终止进程并产生core文件。
34)SIGRTMIN -64)SIGRTMAX:
          Linux的实时信号,他们没有固定的含义(可以由用户自定义)。
          所有的实时信号的默认动作都为终止信号

A.操作系统给自己留的唯一的有效的终止进程的方法
SIGKILL 终止进程
SIGSTOP 暂停进程
这两个信号比较特殊:
都是不能被忽略、捕捉,只能执行默认动作(特别强调,重点种的重点)


B.SIGUSR1 和 SIGUSR2 也比较特殊,特殊在于只有这两个信号
没有默认事件,可以由程序员自己定义事件。

C.SIGTERM 信号要了解

D. SIGCHLD 默认动作是忽略,常用的十来个信号中,唯一一个是默认动作是忽略的信号。

常用的:SIGHUP  SIGINT SIGQUIT SIGBUS  SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2
SIGPIPE SIGALRM SIGTERM SIGCHLD 


PS:
信号的处理动作:
1.执行默认动作
  有五种:
  Term:终止进程
  Ign: 忽略信号(不要和信号的处理动作混了)
  Core:终止进程,生成core文件(查验进程的死亡原因就,用于gdb调试)
  stop:停止(暂停)进程ID
  cont:继续运行进程

2.忽略
3.捕捉


另外需要清楚的是,只有每个信号所对应的事件发生了,该信号才会被
递送(但不一定递达),不应乱发信号!!!!

阻塞的时候,就不能递达。

PS:

信号所处状态

1)递达:递送并且到达进程。注意一定是到达了进程(实际是内核)。
2)未决:产生和递达之间的状态,更详细的描述应该是有可能发生但未发生的事情。主要由于阻塞(屏蔽)导致该状态。
3)非未决:不可能发生的事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值