Linux内核之各个SIG信号含义

  • 1. 有关信号的讨论
    • 1.1 什么是信号?
    • 1.2 信号是如何产生的
    • 1.2 信号如何影响进程的状态?
    • 1.3 信号类似于异常(exception)吗?
    • 1.4 信号是同步还是异步的?
    • 1.5 信号的生命周期是什么?
    • 1.6 什么是信号阻塞和解除阻塞?
    • 1.7 一个进程可以有多个待处理的信号吗?
    • 1.8 大事记
  • 2. SIG信号含义
  • 3. 异常处理程序

1. 有关信号的讨论

Linux中有许多处于不同状态的进程。这些进程属于用户应用程序或操作系统。我们需要一种机制让内核和这些进程协调它们的活动。其中一种方式是在一个进程有重大改变时通知其他进程,因此我们有了 信号 的概念。

信号是软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。

信号基本上是一种单向通知。信号可以由内核发送给一个进程,或由一个进程发送给另一个进程,或者一个进程发送给它自己。

Linux信号的概念来源于Unix。在后来的Linux版本中,加入了实时(real-time)信号。信号是一种简单和轻量级的进程间通信形式,因此适用于嵌入式系统。

1.1 什么是信号?


总共有 31 个标准信号,编号为 1-31。每个信号命名为SIG开头,后跟一个后缀(如INTHUPKILL等)。从 2.2 版开始,Linux 内核支持 33 种不同的实时信号,编号为 32-64,但应用程序应改为使用 SIGRTMIN + n 表示法。标准信号有特定用途,但 SIGUSR1SIGUSR2的使用可以由程序自定义。实时信号也可由程序定义。

0号信号,即 POSIX.1 标准中所说的null信号,一般不使用,但在kill函数中有个特殊的用途。使用时没有信号被发送,但可以用来(相当不可靠)检查进程是否仍然存在。

Linux中的信号实现完全符合 POSIX 标准。最新的实现应该倾向于使用 sigaction 而不是传统的信号接口。

正如硬件子系统可以中断处理器一样,信号可以中断进程的执行。因此,它们被看作是软件中断。一般来说,中断处理程序(interrupt handlers)处理硬件中断,而信号处理程序(signal handlers)则处理信号导致的中断。

通常信号被映射到特定的按键输入,比如,

  • SIGINT代表ctrl+c
  • SIGSTOP代表ctrl+z
  • SIGQUIT代表ctrl+\

1.2 信号是如何产生的

很多条件可以产生一个信号。

  • 当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGNT)。这是停止一个已失去控制程序的方法。
  • 硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV
  • 进程用kill ( 2 )函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。
  • 用户可用kill ( 1 )命令将信号发送给其他进程。此程序是 kill函数的界面。常用此命令终止一个失控的后台进程。
  • 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被 0除),而是软件条件。例如 SIGURG (在网络连接上传来非规定波特率的数据)SIGPIPE(在管道的读进程已终止后一个进程写此管道 ),以及SIGALRM(进程所设置的闹钟时间已经超时)。

信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能只是测试一个变量(例如errno )来判别是否发生了一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作”。
可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。

  1. 忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILLSIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。
  2. 捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。例如,若编写一个命令解释器,当用户用键盘产生中断信号时,很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。如果捕捉到SIGCHILD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用 waitpid以取得该子进程的进程ID以及它的终止状态。又例如,如果进程创建了临时文件,那么可能要为SIGTERM信号编写一个信号捕捉函数以清除临时文件( kill命令传送的系统默认信号是终止信号)。
  3. 执行系统默认动作。下表给出了对每一种信号的系统默认动作。注意,对大多数信号的系统默认动作是终止该进程。

在系统默认动作列,终止w/core表示在进程当前工作目录的core文件中复制了该进程的存储图像(该文件名为core,由此可以看出这种功能很久之前就是 UNIX功能的一部分)。大多数UNIX调试程序都使用core文件以检查进程在终止时的状态。在下列条件下不产生core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者,或者 ( b )进程是设置-组- ID,而且当前用户并非该程序文件的组所有者,或者 ( c )用户没有写当前工作目录的许可权,或者 ( d )文件太大。core文件的许可权(假定该文件在此之前并不存在 )通常是用户读/写,组读和其他读。

1.2 信号如何影响进程的状态?

  • 一些信号会终止正在接受信号的进程:SIGHUPSIGINTSIGTERMSIGKILL

  • 有一些信号不仅可以终止进程还会输出一些内核信息,以帮助程序员调试出错的地方,如SIGABRTabort)、SIGBUSbus error)、SIGILLillegal instruction)、SIGSEGVinvalid memory reference无效内存引用)、SIGSYSbad system call错误的系统调用) )。用于停止进程的信号有:SIGSTOPSIGTSTPSIGCONT 是恢复已停止的进程。

  • 一个程序可以覆盖信号的默认行为。例如,一个交互式程序可以忽略SIGINT(由ctrl+c输入产生)。

  • 不过有两个例外需要注意,SIGKILLSIGSTOP,它们不能被忽略、阻止或用这种方式覆盖。

让我们看一个父进程和其子进程的例子。

  1. 假设子进程向自己发送了SIGSTOP,子进程将被停止。
  2. 这反过来又会触发SIGCHLD到父进程。
  3. 然后,父进程可以使用SIGCONT向子进程发出继续运行的信号。
  4. 当子进程从停止状态重新运行时,另一个SIGCHLD被发送到父进程。
  5. 如果后来,子进程退出了,最后的SIGCHLD会被发送到父进程。

1.3 信号类似于异常(exception)吗?

一些编程语言能够使用诸如try-throw-catch这样的结构进行异常处理。
但信号与异常并不类似。相反,失败的系统或库调用会返回非零的退出代码。当一个进程被终止时,它的退出代码是128加信号编号。例如,一个被SIGKILL杀死的进程将返回137128+9)。

1.4 信号是同步还是异步的?

信号既可以是同步,也可以是异步。

同步信号的出现是由于指令导致了一个无法恢复的错误,如非法地址访问。这些信号被发送到导致它的线程。这些信号也被称为陷阱(trap),因为它们也会导致陷阱进入内核的陷阱处理程序(trap handler)。

异步信号是对当前执行环境的外部信号。从另一个进程中发送 SIGKILL 就是这样一个例子。这些也被称为软件中断。

1.5 信号的生命周期是什么?


一个信号经历三个阶段:

  1. Generation:信号可以由内核或任何进程生成,生成后会将其发送给特定的进程。信号由其编号表示,没有额外的数据或参数。因此,信号是轻量级的。但是,POSIX 实时信号传递额外的数据。可以生成信号的系统调用和函数包括 raisekillkillpgpthread_killtgkillsigqueue
  2. Delivery:信号在传递之前一直处于待处理状态。通常,内核会尽快将信号传递给进程。但是,如果对应的进程阻塞了信号,它将保持未处理状态直到解除阻塞。
  3. Processing:一旦信号被传递到,就会以多种方式中其中一种进行处理。每个信号都有一个默认的行为:忽略信号;或终止进程,有时使用核心转储(core dump);或停止/继续该过程。对于非默认行为,对应的处理函数会被调用。通过 sigaction 函数指定究竟采用哪一种处理方式。

1.6 什么是信号阻塞和解除阻塞?


信号打断了程序执行的正常流程。当进程正在执行一些关键代码或更新与信号处理程序共享的数据时,这是不希望看到的。阻断的引入解决了这个问题。不过代价是,信号处理被延迟了。

每个进程都可以指定它是否要阻塞一个特定的信号。如果被阻断,而信号确实发生了,操作系统将把该信号作为待处理信号。一旦进程解除阻断,该信号将被传递。当前被屏蔽的信号集合被称为信号屏蔽(signal mask)。

无限期地阻断一个信号是没有意义的。为了这个目的,进程可以在接受到信号后选择忽略它,被一个进程屏蔽的信号不会影响其他进程,他们可以正常接收信号。

信号屏蔽(Signal mask)可以用 sigprocmask(单线程)或 pthread_sigmask(多线程)来设置。 当一个进程有多个线程时,信号可以针对每个线程分别设置是否屏蔽。信号将被传递给任何一个没有阻断它的线程。从本质上讲,信号处理程序是针对某个进程的,信号掩码是针对某个线程的。

1.7 一个进程可以有多个待处理的信号吗?

是的,许多标准信号可以在进程中被挂起。然而,一个给定的信号类型只能有一个实例被挂起。这是因为信号的挂起和阻塞是作为位掩码(bitmask)实现的,每个信号类型只有一个位。例如,我们可以让 SIGALRMSIGTERM 同时挂起,但我们不能有两个 SIGALRM 信号挂起。进程将只收到一个SIGALRM信号,即使是多次抛出。

通过实时信号,信号可以和数据一起排队,这样每个信号的实例都可以单独传递和处理。

POSIX没有规定标准信号的传递顺序,也没有规定如果标准信号和实时信号都在等待中会如何处理。然而在Linux中,会优先处理标准信号。对于实时信号,编号较低的信号首先被传递,如果一个信号类型有很多在排队,最早的一个会被首先传递。

1.8 大事记

  • 1990 信号在 POSIX.1-1990 标准中得到了描述。可以追溯至 IEEE标准1003.1-1988

  • 1993 实时扩展作为 POSIX.1b 发布。其中包含实时信号。

  • 1999 随着内核版本 2.2 的发布,Linux 开始支持实时信号。

  • 2001 POSIX.1-2001 标准中增加了更多信号:SIGBUSSIGPOLLSIGPROFSIGSYSSIGTRAPSIGURGSIGVTALRMSIGXCPUSIGXFSZ

    uos@uos-PC:$ kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP6) 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
    

2. SIG信号含义

在 Linux 下,每个信号的名字都以字符 SIG 开头,每个信号和一个数字编码相对应,在头文件 signum.h 中,这些信号都被定义为正整数。

/* We define here all the signal names listed in POSIX (1003.1-2008);as of 1003.1-2013, no additional signals have been added by POSIX.We also define here signal names that historically exist in everyreal-world POSIX variant (e.g. SIGWINCH).Signals in the 1-15 range are defined with their historical numbers.For other signals, we use the BSD numbers.There are two unallocated signal numbers in the 1-31 range: 7 and 29.Signal number 0 is reserved for use as kill(pid, 0), to test whethera process exists without sending it a signal.  *//* ISO C99 signals.  */
#define SIGINT      2   /* Interactive attention signal.  */
#define SIGILL      4   /* Illegal instruction.  */
#define SIGABRT     6   /* Abnormal termination.  */
#define SIGFPE      8   /* Erroneous arithmetic operation.  */
#define SIGSEGV     11  /* Invalid access to storage.  */
#define SIGTERM     15  /* Termination request.  *//* Historical signals specified by POSIX. */
#define SIGHUP      1   /* Hangup.  */
#define SIGQUIT     3   /* Quit.  */
#define SIGTRAP     5   /* Trace/breakpoint trap.  */
#define SIGKILL     9   /* Killed.  */
#define SIGBUS      10  /* Bus error.  */
#define SIGSYS      12  /* Bad system call.  */
#define SIGPIPE     13  /* Broken pipe.  */
#define SIGALRM     14  /* Alarm clock.  *//* New(er) POSIX signals (1003.1-2008, 1003.1-2013).  */
#define SIGURG      16  /* Urgent data is available at a socket.  */
#define SIGSTOP     17  /* Stop, unblockable.  */
#define SIGTSTP     18  /* Keyboard stop.  */
#define SIGCONT     19  /* Continue.  */
#define SIGCHLD     20  /* Child terminated or stopped.  */
#define SIGTTIN     21  /* Background read from control terminal.  */
#define SIGTTOU     22  /* Background write to control terminal.  */
#define SIGPOLL     23  /* Pollable event occurred (System V).  */
#define SIGXCPU     24  /* CPU time limit exceeded.  */
#define SIGXFSZ     25  /* File size limit exceeded.  */
#define SIGVTALRM   26  /* Virtual timer expired.  */
#define SIGPROF     27  /* Profiling timer expired.  */
#define SIGUSR1     30  /* User-defined signal 1.  */
#define SIGUSR2     31  /* User-defined signal 2.  *//* Nonstandard signals found in all modern POSIX systems(including both BSD and Linux).  */
#define SIGWINCH    28  /* Window size change (4.3 BSD, Sun).  *//* Archaic names for compatibility.  */
#define SIGIO       SIGPOLL /* I/O now possible (4.2 BSD).  */
#define SIGIOT      SIGABRT /* IOT instruction, abort() on a PDP-11.  */
#define SIGCLD      SIGCHLD /* Old System V name *//* Not all systems support real-time signals.  bits/signum.h indicatesthat they are supported by overriding __SIGRTMAX to a value greaterthan __SIGRTMIN.  These constants give the kernel-level hard limits,but some real-time signals may be used internally by glibc.  Do notuse these constants in application code; use SIGRTMIN and SIGRTMAX(defined in signal.h) instead.  */
#define __SIGRTMIN  32
#define __SIGRTMAX  __SIGRTMIN/* Biggest signal number + 1 (including real-time signals).  */
#define _NSIG       (__SIGRTMAX + 1)

要想查看这些信号和编码的对应关系,可使用命令:kill -l

uos@uos-PC:$ kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP6) 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 ~ 31 的不可靠信号)进行简单介绍。

  1. SIGHUP : 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一 session 内的各个作业, 这时它们与控制终端不再关联。

    登录 Linux 时,系统会分配给登录用户一个终端( Session )。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session 。当用户退出 Linux 登录时,前台进程组和后台有对终端输出的进程将会收到 SIGHUP 信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如 wget 能捕获 SIGHUP 信号,并忽略它,这样就算退出了Linux 登录,wget 也能继续下载。

    此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

  2. SIGINT: 程序终止( interrupt )信号, 在用户键入 INTR 字符(通常是 Ctrl + C )时发出,用于通知前台进程组终止进程。

  3. SIGQUIT :和SIGINT类似, 但由 QUIT 字符(通常是 Ctrl + / )来控制. 进程在因收到 SIGQUIT 退出时会产生 core 文件, 在这个意义上类似于一个程序错误信号。

  4. SIGILL : 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。

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

  6. SIGABRT:调用 abort 函数生成的信号。

  7. SIGBUS:非法地址, 包括内存地址对齐( alignment )出错。比如访问一个四个字长的整数, 但其地址不是 4 的倍数。它与 SIGSEGV 的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。

  8. SIGFPE : 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

  9. SIGKILL : 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

  10. SIGUSR1: 留给用户使用

  11. SIGSEGV : 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据。

  12. SIGUSR2 : 留给用户使用

  13. SIGPIPE :管道破裂。这个信号通常在进程间通信产生,比如采用 FIFO (管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到 SIGPIPE 信号。此外用Socket 通信的两个进程,写进程在写 Socket 的时候,读进程已经终止。

  14. SIGALRM :时钟定时信号, 计算的是实际的时间或时钟时间。alarm 函数使用该信号。

  15. SIGTERM:程序结束( terminate )信号, 与 SIGKILL 不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell 命令 kill 缺省产生这个信号。如果进程终止不了,我们才会尝试 SIGKILL。

  16. SIGSTKFLT

  17. SIGCHLD :子进程结束时, 父进程会收到这个信号。
    如果父进程没有处理这个信号,也没有等待( wait )子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略 SIGCHILD 信号,或者捕捉它,或者 wait 它派生的子进程,或者父进程先终止,这时子进程的终止自动由 init 进程来接管)。

  18. SIGCONT :让一个停止( stopped )的进程继续执行。本信号不能被阻塞。可以用一个 handler 来让程序在由 stopped 状态变为继续执行时完成特定的工作。例如, 重新显示提示符。

  19. SIGSTOP:停止( stopped )进程的执行。注意它和 terminate 以及 interrupt 的区别:该进程还未结束, 只是暂停执行。本信号不能被阻塞,处理或忽略。

  20. SIGTSTP:停止进程的运行, 但该信号可以被处理和忽略。用户键入 SUSP 字符时(通常是 Ctrl + Z )发出这个信号。

  21. SIGTTIN :当后台作业要从用户终端读数据时,该作业中的所有进程会收到 SIGTTIN 信号。缺省时这些进程会停止执行。

  22. SIGTTOU :类似于 SIGTTIN,但在写终端(或修改终端模式)时收到。

  23. SIGURG:有“紧急”数据或 out-of-band 数据到达 socket 时产生。

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

  25. SIGXFSZ:当进程企图扩大文件以至于超过文件大小资源限制。

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

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

  28. SIGWINCH :窗口大小改变时发出。

  29. SIGIO :文件描述符准备就绪,可以开始进行输入/输出操作。

  30. SIGPWRPower failure

  31. SIGSYS:非法的系统调用。

在以上列出的信号中,比较特殊的有:

程序不可捕获、阻塞或忽略的信号有: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
此外,SIGIOSVR4 是退出,在 4.3BSD 中是忽略;SIGCONT 在进程挂起时是继续,否则是忽略,不能被阻塞。

3. 异常处理程序

每个异常都由专门的异常处理程序来处理,它们通常把一个Unix信号发送到引起异常的进程。

refer to
以SIGSEGV为例详解信号处理(与栈回溯)
【转译】Linux中的信号(signal)
linux-signals

Linux内核之各个SIG信号含义相关推荐

  1. linux 各个SIG信号含义

    很有用的sig信号含义说明  转发自  :https://blog.csdn.net/tennysonsky/article/details/46010505 在 Linux 下,每个信号的名字都以字 ...

  2. linux内核定义的常用信号6,Linux中的信号

    在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...

  3. linux内核定义的常用信号6,linux复习

    (3)设定apache服务器的网页根目录:/home/htdocs (4)在此apache服务器上设定一个目录/home/htdocs/inside,且此目录只允许IP地址为192.168.1.5的主 ...

  4. linux内核配置系统浅析(转)

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  5. Linux内核配置系统浅析

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  6. 深入理解LINUX内核 第三版2.6 笔记

    目录 第二章 内存寻址 分段 P41 Linux分段 P46 硬件中的分页 P50 第三章 进程 第四章 中断和异常 第五章 内核同步 第六章 定时测量 第七章 进程调度 第八章 内存管理 页框管理 ...

  7. LINUX内核编译(ZT)

    LINUX内核编译(ZT) 在这里转贴一些关于内核编译的文章,绝非笔者原创,也无意注明出处.有些内容有重复之处,请原谅. ==================================== 一. ...

  8. Linux内核驱动开发(一)

    Linux内核初探 linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代 ...

  9. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux信号机制分析

    Linux信号机制分析 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008 ...

最新文章

  1. 准备入门IC的全局观念系列-上
  2. leetcode 删除链表的倒数第N个节点
  3. C语言储蓄系统编程,C语言:银行储蓄系统的开发(初级)-Go语言中文社区
  4. fckeditor异常总结---java.lang.ClassNotFoundException: org.devlib.schmidt.imageinfo.ImageInfo
  5. postgre管理员 无法访问表_PostgreSQL常见问题处理方法
  6. SharePoint 2013 同步FBA认证用户
  7. 如何提升深度学习的性能
  8. 概率论与数理统计(第四版) 第一章:概率论的基本概念(总结)
  9. 【DIY】自动鱼缸控制系统——【一】
  10. 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF
  11. Spring Cloud Netflix之为上一个damo添加Ribbon(负载均衡优化)
  12. redis中使用GeoHash
  13. jena 查询 java_使用SPARQL和Jena查询DBpedia
  14. Zookeeper学习思维导图
  15. 刚接触js不久,自己写的banner幻灯片效果。
  16. 无线授时服务器接LED屏,实现ipad远程无线控制led大屏幕分以下几个步骤!
  17. MyBatis学习总结_13_Mybatis查询之resultMap和resultType区别
  18. Unity拖动背包物品/技能图标位置互换
  19. Java解决鸡兔同笼问题
  20. Mac鼠标跟踪速度慢的问题(小技巧)

热门文章

  1. 等保测评--工业控制系统安全扩展要求
  2. 计算机二级小蒋是一位中学老师,解析:小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学 - 计算机二级 - 看书网站...
  3. 移动式自动气象站优势
  4. 邮件服务器有故障 英文,ClamAV 故障
  5. linux配置mp3. rmvb解码器
  6. 【历史上的今天】9 月 8 日:阿里开放平台计划;英特尔发布首款双核酷睿处理器;我国研制全数字高清晰度电视系统
  7. java配置ssm_不用xml 配置文件,纯粹使用java配置类搭建SSM项目
  8. 真人语音朗读软件_影视解说视频配音,抖音配音,微课配音,实用免费配音软件,文本朗读,一键文字转语音,媲美真人的配音软件...
  9. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)
  10. Python爬虫实战-爬取百度贴吧帖子