当前位置:首页 > 系统教程 > 正文

Linux探索学习第二十七弹——信号(上):Linux信号基础详解

Linux探索学习第二十七弹——信号(上):Linux信号基础详解

从零开始掌握Linux信号机制:信号概念、发送与默认处理

Linux探索学习第二十七弹——信号(上):Linux信号基础详解 Linux信号 信号处理 kill命令 信号类型 第1张

在Linux系统中,信号是一种进程间通信的机制,用于通知进程发生了异步事件。信号可以看作是软件层次上对中断的一种模拟,它使得进程能够响应外部或内部产生的事件。本文将带你深入了解Linux信号的基础知识,包括信号的产生、默认处理方式以及如何发送信号。

1. 什么是信号?

信号是一个发送给进程的简短消息,通常用来表示某种事件的发生。例如,当用户按下 Ctrl+C 时,终端驱动程序会产生 SIGINT 信号并发送给前台进程,默认情况下该信号会导致进程终止。信号是异步的,意味着进程无法预知信号何时到达。

2. 常见信号类型

Linux定义了多种标准信号,每个信号都有一个唯一的编号和名称。以下是一些常用信号:

  • SIGHUP (1) —— 终端挂起或控制进程终止
  • SIGINT (2) —— 来自键盘的中断(Ctrl+C)
  • SIGQUIT (3) —— 来自键盘的退出(Ctrl+\)
  • SIGKILL (9) —— 强制终止进程(不可捕获或忽略)
  • SIGTERM (15) —— 终止进程(默认的终止信号)
  • SIGSTOP (17,18,19) —— 暂停进程(不可捕获或忽略)

3. 信号的产生与发送

信号可以通过多种方式产生:

  • 键盘事件:Ctrl+C 产生 SIGINT,Ctrl+Z 产生 SIGTSTP。
  • 系统调用:kill() 函数可以向指定进程发送信号。
  • 软件条件:如定时器到期、子进程状态改变等。
  • 硬件异常:如除零、段错误等会产生 SIGFPE、SIGSEGV。

在命令行中,最常用的发送信号工具是 kill命令。例如,kill -9 1234 会向 PID 为 1234 的进程发送 SIGKILL 信号,强制结束该进程。

4. 信号的处理方式

进程收到信号后,可以选择以下三种方式之一进行处理:

  • 忽略信号:进程明确告诉内核不需要处理该信号,但 SIGKILL 和 SIGSTOP 不能被忽略。
  • 捕获信号:进程注册一个信号处理函数,当信号到达时调用该函数。
  • 执行默认操作:每个信号都有一个预定义的默认行为,例如终止进程、暂停进程等。

通过 signal()sigaction() 系统调用,进程可以修改对特定信号的处理方式(SIGKILL 和 SIGSTOP 除外)。

5. 信号的阻塞与未决

进程可以设置信号屏蔽字,阻塞某些信号的递送。被阻塞的信号会保持在未决状态,直到解除阻塞后才被处理。每个进程都有一个信号屏蔽字和一个未决信号集。

本文介绍了 Linux信号 的基本概念、常见 信号类型、信号的发送方式(如 kill命令)以及 信号处理 的几种方式。在下一篇文章中,我们将深入探讨如何在编程中使用信号,包括信号处理函数的编写和注意事项。