插件窝 干货文章 linux signal用来做什么

linux signal用来做什么

进程 信号 终止 捕获 919    来源:    2025-04-30

Linux 信号(Signal)是操作系统内核或进程间通信的一种基本机制,主要用于通知进程发生了某种事件。它允许进程或内核中断进程的正常执行流程,强制其处理异步事件。以下是信号的典型用途和分类:


1. 核心用途

  • 进程控制

    • 终止进程:SIGTERM(优雅终止)、SIGKILL(强制终止)。
    • 暂停/恢复进程:SIGSTOP(强制暂停)、SIGCONT(恢复执行)。
    • 中断进程:SIGINT(终端中断,如 Ctrl+C)。
  • 异常处理

    • 处理程序错误:SIGSEGV(段错误)、SIGFPE(除零错误)。
    • 调试支持:SIGTRAP(调试断点)。
  • 进程间通信(IPC)

    • 简单通知:一个进程可通过 kill() 向另一个进程发送信号(如 SIGUSR1 自定义用途)。
  • 系统事件通知

    • 子进程终止:SIGCHLD(通知父进程回收子进程资源)。
    • 终端关闭:SIGHUP(如 SSH 断开时通知守护进程)。

2. 常见信号列表

信号名 默认行为 触发场景
SIGINT 2 终止进程 用户按下 Ctrl+C
SIGTERM 15 终止进程 kill 默认发送的信号
SIGKILL 9 强制终止 不可捕获或忽略
SIGSTOP 19 暂停进程 不可捕获或忽略
SIGCONT 18 恢复执行 恢复被暂停的进程
SIGSEGV 11 终止+核心转储 非法内存访问
SIGPIPE 13 终止进程 管道写入端关闭(如 | head
SIGUSR1/2 10/12 无默认行为 用户自定义用途

3. 信号的处理方式

  • 默认行为:大多数信号会终止进程,部分会暂停或忽略。
  • 捕获信号:进程可通过 signal()sigaction() 注册信号处理函数。
    c #include <signal.h> void handler(int sig) { /* 自定义逻辑 */ } signal(SIGINT, handler); // 捕获 SIGINT
  • 忽略信号:通过 signal(SIGXXX, SIG_IGN) 忽略信号(SIGKILLSIGSTOP 除外)。
  • 阻塞信号:使用 sigprocmask() 临时屏蔽信号,延迟处理。

4. 实际应用场景

  • 优雅停止服务:发送 SIGTERM 通知服务清理资源后退出。
  • 守护进程:处理 SIGHUP 重新加载配置文件。
  • 多进程协作:父进程通过 SIGCHLD 回收子进程,避免僵尸进程。
  • 调试程序:通过 SIGTRAP 触发调试器断点。

5. 注意事项

  • SIGKILLSIGSTOP 不能被捕获、忽略或阻塞。
  • 信号处理函数应尽量简单(如设置标志位),避免调用非异步安全函数(如 printf)。
  • 信号可能丢失(非可靠信号),高可靠性场景需结合其他 IPC(如管道、套接字)。

示例命令

# 发送 SIGTERM 终止进程(PID=1234)
kill 1234

# 强制杀死进程
kill -9 1234

# 列出所有信号
kill -l

通过理解信号机制,可以更高效地控制进程行为并处理异常事件。