Python 库手册:signal 系统信号处理模块

发布于:2025-07-31 ⋅ 阅读:(24) ⋅ 点赞:(0)

Python 的 signal 模块提供了用于处理 Unix 风格信号的机制,主要用于与操作系统交互,响应如终止、挂起、中断等信号事件。你可以注册自定义的信号处理函数,从而在接收到特定信号时执行自定义代码逻辑。

常见应用场景:

(1)优雅关闭程序(如处理 SIGINT 中断)。

(2)定时器超时控制(如设置请求或函数的超时时间)。

(3)守护进程、子进程通信。

(4)阻塞操作中断。

(5)处理终端退出、挂起、重启等系统信号。

  ◆  ◆

核心概念

1、信号(Signal)

由操作系统或用户触发的事件通知,比如按下 Ctrl + C 会产生 SIGINT,进程退出会产生 SIGTERM。

2、处理器(Handler)

通过 signal.signal() 为特定信号注册的回调函数。

3、默认行为

大多数信号默认会终止程序,除非被重定义。

4、信号编号

信号如 SIGINT, SIGTERM 都是常量,对应实际整数编号。

5、不可捕获信号

如 SIGKILL, SIGSTOP 无法被 Python 程序捕获或忽略

  ◆  ◆

应用举例

例 1:捕获 Ctrl + C 中断信号(SIGINT)

import signalimport time
def handler(signum, frame):    print("接收到 Ctrl+C(SIGINT)信号,准备退出...")
signal.signal(signal.SIGINT, handler)
print("程序运行中,按 Ctrl+C 尝试中断")while True:    time.sleep(1)

例 2:设置超时处理机制(定时器 SIGALRM)

import signalimport time
def timeout_handler(signum, frame):    raise TimeoutError("操作超时!")
# 注册超时处理器signal.signal(signal.SIGALRM, timeout_handler)signal.alarm(3)  # 3 秒后触发 SIGALRM
try:    print("开始执行长时间操作...")    time.sleep(5)except TimeoutError as e:    print("捕获异常:", e)

例 3:优雅关闭子进程或服务(SIGTERM)

import signalimport sys
def terminate_handler(signum, frame):    print("接收到 SIGTERM,清理资源后退出")    sys.exit(0)
signal.signal(signal.SIGTERM, terminate_handler)
print("运行中,发送 SIGTERM 可终止程序")while True:    time.sleep(1)

例 4:忽略某些信号(如 SIGHUP)

import signalimport time
signal.signal(signal.SIGHUP, signal.SIG_IGN)  # 忽略挂起信号
print("忽略 SIGHUP 信号,程序不会退出")while True:    time.sleep(1)

例 5:注册多个信号响应(SIGINT 和 SIGTERM)

import signalimport time
def handler(signum, frame):    print(f"接收到信号:{signum},程序将退出")    exit(0)
signal.signal(signal.SIGINT, handler)signal.signal(signal.SIGTERM, handler)
print("等待信号(Ctrl+C 或 kill)...")while True:    time.sleep(1)

  ◆  ◆

常用函数速览

signal.alarm(seconds)

设置信号定时器,在指定秒数后触发 SIGALRM。

参数:

seconds:延迟秒数,0 表示取消定时器

返回:前一个定时器剩余秒数(若有)

signal.getsignal(signalnum)

获取当前某个信号的处理器。

参数:

signalnum:信号编号(如 signal.SIGINT)

返回:当前注册的处理函数

signal.pause()

阻塞程序直到接收到信号。

参数:无

返回:被信号中断时继续执行

signal.setitimer(which, seconds, interval=0)

设置信号定时器(更高精度),代替 alarm()。

参数:

which:如 signal.ITIMER_REAL(实时时间,发出 SIGALRM)

seconds:首次触发延迟

interval:之后每次的间隔(0 表示只触发一次)

返回:前一个定时器的剩余时间(元组)

signal.signal(signalnum, handler)

为指定信号注册处理函数。

参数:

signalnum:信号编号(如 signal.SIGTERM)

handler:处理函数,或特殊值如 signal.SIG_IGN(忽略)或 signal.SIG_DFL(默认行为)

返回:之前的处理器

  ◆  ◆

补充说明

1、仅主线程可设置信号处理器。注册处理器(signal.signal())必须在主线程中进行。

2、Windows 支持有限。仅支持 SIGINT, SIGBREAK, SIGABRT,不支持 SIGALRM, SIGTERM 等 Unix 信号。

3、常用信号说明:

SIGINT:中断(Ctrl + C)

SIGTERM:终止请求(如 kill)

SIGALRM:超时(定时器)

SIGKILL / SIGSTOP:不可捕获

图片

“点赞有美意,赞赏是鼓励”


网站公告

今日签到

点亮在社区的每一天
去签到