← 返回首页
Linux高级程序设计(三十六)
发表时间:2021-11-21 21:33:25
信号概述

信号(signal)是 Linux 进程间通信的最古老的方式。信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 。

1.信号 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号(signal)为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。

每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。信号定义在signum.h头文件中,信号名都定义为正整数。

具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0有特殊的应用。

注意:信号都是系统预定义好的,用户无需自定义自己的信号。

2.信号的产生方式

  1. 当用户按某些终端键时,将产生信号。 用户按某些组合键时,会产生信号。例如:终端上按“Ctrl+c”组合键通常产生中断信号 SIGINT,终端上按“Ctrl+\”键通常产生中断信号 SIGQUIT,终端上按“Ctrl+z”键通常产生中断信号 SIGSTOP 等。

  2. 硬件异常将产生信号。 除数为 0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。

  3. 软件异常将产生信号。 当检测到某种软件条件已发生,并将其通知有关进程时,产生信号。

  4. 调用 kill() 函数将发送信号。 注意:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。

  5. 运行 kill 命令将发送信号。 此程序实际上是使用 kill 函数来发送信号。也常用此命令终止一个失控的后台进程。

3.信号处理方式

  1. 终止进程
  2. 缺省处理
  3. 停止进程
  4. 让停止进程恢复运行

注意:每一个信号只有一个默认的处理方式。

一个进程收到一个信号的时候,可以用如下方法进行处理: 1. 执行系统默认动作 对大多数信号来说,系统默认动作是用来终止该进程。

  1. 忽略此信号 接收到此信号后没有任何动作。

  2. 执行自定义信号处理函数 使用用户定义的信号处理函数处理该信号。

注意:SIGKILL 和 SIGSTOP 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法。

4.常见信号 |编号|信号名称|缺省动作|说明| |-|-|-|-| |1|SIGHUP|终止|终止控制终端或进程| |2|SIGINT|终止|键盘产生的中断(Ctrl-C)| |3|SIGQUIT|dump|键盘产生的退出| |4|SIGILL|dump|非法指令| |5|SIGTRAP|dump|debug中断| |6|SIGABRT/SIGIOT|dump|异常中止| |7|SIGBUS/SIGEMT|dump|总线异常/EMT指令| |8|SIGFPE|dump|浮点运算溢出| |9|SIGKILL|终止|强制进程终止| |10|SIGUSR1|终止|用户信号,进程可自定义用途| |11|SIGSEGV|dump|非法内存地址引用| |12|SIGUSR2|终止|用户信号,进程可自定义用途| |13|SIGPIPE|终止|向某个没有读取的管道中写入数据| |14|SIGALRM|终止|时钟中断(闹钟)| |15|SIGTERM|终止|进程终止| |16|SIGSTKFLT|终止|协处理器栈错误| |17|SIGCHLD|忽略|子进程退出或中断| |18|SIGCONT|继续|如进程停止状态则开始运行| |19|SIGSTOP|停止|停止进程运行| |20|SIGSTP|停止|键盘产生的停止| |21|SIGTTIN|停止|后台进程请求输入| |22|SIGTTOU|停止|后台进程请求输出| |23|SIGURG|忽略|socket发生紧急情况| |24|SIGXCPU|dump|CPU时间限制被打破| |25|SIGXFSZ|dump|文件大小限制被打破| |26|SIGVTALRM|终止|虚拟定时时钟| |27|SIGPROF|终止|profile timer clock| |28|SIGWINCH|忽略|窗口尺寸调整| |29|SIGIO/SIGPOLL|终止|I/O可用| |30|SIGPWR|终止|电源异常| |31|SIGSYS/SYSUNUSED|dump|系统调用异常|