在 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 是一个立即销毁进程的命令。