Linux 中的信号中断——初学者介绍

Linux 中的进程由信号中断控制。 Linux 中的信号是 Linux 最基本和最基本的结构之一。 信号和进程几乎控制着系统的每一项任务。 所以了解Linux信号的基本结构和功能是很值得的。

在本教程中,我们将讨论各种信号、它们的功能以及如何调用它们。

如何在 Linux 中使用 kill 命令?

什么是信号中断,为什么我们需要它?

在像 Linux 这样的操作系统中,有许多进程同时运行。 这些进程通常依赖于与它们一起运行的其他进程的状态。 他们需要一种相互沟通的方式来保持稳定。 进程通过发送称为信号的单向通知进行通信。

信号不一定需要在两个进程之间,信号可以发送到内核和从内核发送到进程。

图 1:流程图表示内核和进程之间的信号流

信号有时被描述为信号中断,因为在大多数情况下,它们会中断程序的正常执行流程,并且它们的到达是不可预测的。

信号动作

每个信号中断都有一个当前处置,它决定了进程在将信号传递给它们时的行为方式。 有一些默认方式( Actions ) 进程响应信号的方式,这里是一个表格,描述了每个信号的不同操作。

行动 默认处置
学期 进程终止导致进程异常终止
伊恩 该信号被忽略并且对过程没有影响。
创建核心转储文件后,该过程终止。
停止 暂停进程。
帐户 如果进程被挂起,则继续进程。

表 1:操作及其默认配置

进程可以使用 sigaction 更改信号的配置。 使用这些系统调用,进程可以选择以下行为之一在信号传递时发生:

  • 执行默认操作
  • 忽略信号
  • 使用信号处理程序捕获信号,这是一个程序员定义的函数,在信号传递时会自动调用。

一些常见信号及其意义

有31个标准信号,编号为1-31。 每个信号都被命名为“SIG”,后跟一个后缀。 从 2.2 版开始,Linux 内核支持 33 种不同的实时信号。

这里有几个 您可能遇到的常见信号:

信号名称 信号编号 单动作 描述
签到 1 学期 检测到控制终端挂断或控制进程死亡
信号情报 2 学期 键盘中断(通常是 Ctrl-C)
退出 3 学期 手动中断(通常是 Ctrl-D)
SIGKILL 9 学期 立即终止进程,无需清理。
SIGSEGV 11 无效的内存引用

表 2:一些常见信号及其各自的动作。

信号编号 0,在 POSIX.1 中称为 null signal, 一般不使用,但 kill 函数将此用作特殊情况。 不发送信号,但可用于检查进程是否仍然存在。

向进程发送信号中断

发送信号中断最常用的方法之一是使用 kill function,其语法如下:

 kill -signal pid 

例子:

一种 SIGHUP 信号以pid 1001发送到进程

kill -1 1001 

一种 SIGKILL 将信号发送到 pid 为 1001 的进程以立即终止该进程。

kill -9 1001 

还存在另一个功能 raise 向调用进程本身发送信号。 发送信号时,进程甚至在 raise 函数返回之前就已接收到该信号。

结论和参考

这篇关于 Linux 信号的介绍性教程到此结束。 请继续关注有关 Linux 和其他开源程序的更多此类文章。

参考:

  • singal 上的 Linux 手册页
  • Linux kill 手册页