6. 信号

在 Linux 中,信号是发送给进程的软件中断,用于通知它发生了重要事件。理解linux signals是有效管理进程和系统行为的基础。

信号的目的

信号是进程间通信(IPC)的主要方式之一。它们有多种用途:

  • 用户交互:用户可以通过输入特殊的终端字符(如 Ctrl-C (SIGINT) 或 Ctrl-Z (SIGTSTP))来中断或暂停前台进程。
  • 内核通知:内核可以向进程发送信号,以通知它发生了硬件或软件问题,例如非法内存访问 (SIGSEGV)。
  • 进程管理:系统管理员和其他进程使用信号来管理其他进程的生命周期,例如请求终止或重新加载配置。

信号生命周期

当一个事件生成信号时,它首先被传递给目标进程。该信号处于“待处理”状态,直到内核运行该进程。当进程被调度时,信号被传递。然而,进程具有信号掩码,可以配置该掩码来阻止特定信号的传递。

当信号被传递时,进程可以采取以下几种操作之一:

  • 忽略信号:进程简单地丢弃信号并继续执行。
  • 捕获信号:进程执行一个称为信号处理程序的自定义函数来响应该事件。
  • 执行默认操作:如果没有被捕获或忽略,则执行默认操作。对于许多信号,这意味着终止进程。
  • 阻塞信号:如果信号在进程的信号掩码中,它将保持待处理状态,直到被解除阻塞。

常见的 Linux 进程信号

每个信号都由一个整数定义,但它们几乎总是以其符号名称(即 os sig code)来引用,这些名称以 SIG 开头。虽然数字在不同架构上可能略有不同,但名称是一致的。以下是一些最常见的 linux process signals

  • SIGHUP (1):挂断。通常用于告知守护进程重新加载其配置。
  • SIGINT (2):中断。由 Ctrl-C 发送。它是终止进程的请求。
  • SIGKILL (9):杀死。这是一种立即、强制的终止。进程无法捕获、忽略或阻塞此信号。
  • SIGSEGV (11):段错误。表示进程进行了无效的内存引用。
  • SIGTERM (15):终止。这是请求进程终止的标准、礼貌的方式。它是 kill 命令发送的默认信号。进程可以捕获此信号以在退出前执行清理工作。这通常被称为 signal 15 linux
  • SIGSTOP:停止。暂停进程。与 SIGKILL 一样,它不能被捕获或忽略。

SIGTERM (linux signal 15) 和 SIGKILL 的关键区别在于,SIGTERM 是一个可以被处理的请求,而 SIGKILL 是一个立即销毁进程的命令。

登录以保存您的学习进度

登录

练习

熟能生巧!这是一个实践实验室,旨在加强您对进程以及信号如何用于与进程交互的理解:

  1. 管理和监控 Linux 进程 - 在此实验室中,您将学习管理和监控 Linux 系统上进程的基本技能。您将探索如何与前台和后台进程交互,使用 ps 检查它们,使用 top 监控资源,使用 renice 调整优先级,以及使用 kill 终止它们。使用 kill 终止进程是发送信号的直接应用。

此实验室将帮助您在实际场景中应用进程管理和信号底层使用的概念,并建立对 Linux 系统管理的信心。

测验

哪个信号是不可阻塞的?请用英语回答,使用确切的信号名称并注意大小写。