Linux信号(一)-- 信号的基本概念

1、基本概念

信号是软件中断,很多比较重要的应用程序都需要处理信号。信号是一种进程之间或者内核与进程间异步通信的一种机制,例如:用户在终端键入中断键,会通过信号机制停止一个程序。每个信号都有一个名字(以SIG开头),例如,SIGABRT是夭折信号,当进程调用abort函数是产生这种信号;SIGALRM是闹钟信号,有alarm函数设置的定时器超时后将产生这种信号。在头文件signal.h中,信号名都被定义为正整数常量(信号编号)。不存在编号为0的信号,kill函数对信号编号0有特殊的用途。
在终端,我们可以使用命令kill -l 查看所有的signal信号。
Linux信号(一)-- 信号的基本概念

2、信号产生的条件

  • 当用户按某些终端键时,引发终端产生的信号。例如在终端按下Ctrl+C键通常产生中断信号(SIGINT);
  • 硬件异常:除数为0、无效的内存引用等;
  • 进程调用kill(2)函数可以任意信号发送给任一进程或者进程组(限制:接收信号进程和发送信号进程的所有者必须相同或者发送信号进程的所有者必须是超级用户);
  • 用户可用kill(1)命令将信号发送给其他进程;
  • 当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号;

信号是异步事件的经典实例,产生信号的事件是随机出现的,进程不能够通过简单地测试一个变量来判断是否发生一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作”。
在某信号出现时,可以告诉内核按下列3种方式之一进行处理,我们称之为信号的处理或信号的相关动作

  • 忽略此信号。大多数信号都可以使用这种方式进行处理,但是有两种信号决不能忽略:SIGKILL和SIGSTOP,这是因为他们向内核和超级用户提供了使进程终止或停止的可靠方法。另外,如果忽略由某些硬件产生的信号(如非法内存引用或除以0),则进程的运行行为是未定义的;
  • 捕捉信号。我们需要通知内核在某种信号发生时,调用一个用户函数,在用户函数中,可执行用户希望对这种事件进行的处理。注意:不能捕捉SIGKILL和SIGSTOP信号;
  • 执行系统默认动作,注意:大多数信号的系统默认动作是终止该进程。

下图中列出了所有信号的名字,说明了哪些系统支持此信号以及这些信号的系统默认动作。在“默认动作”列中,“终止+core”表示在进程当前工作目录的core文件中复制该进程的存储映像。大多数UNIX调试程序都使用core文件以检查进程终止时的状态
Linux信号(一)-- 信号的基本概念
关于这些信号的详细解释大家可以看看《unix环境高级编程》 p252。