整体说明
signal.signal()是 Python 中用于设置信号处理方式的核心函数signal.signal()主要用于捕获和处理操作系统发送的各种信号(如中断信号、子进程状态变化信号等)
signal.signal 函数说明
基本语法如下:
1
2
3import signal
signal.signal(signalnum, handler)参数说明:
signalnum:需要处理的信号类型(如signal.SIGINT表示键盘中断,signal.SIGCHLD表示子进程状态变化等)handler:信号处理函数(或特殊常量),用于定义收到信号后的行为
信号类型(signalnum)
- 常见的信号常量包括:
signal.SIGINT:程序终止(Interrupt)信号,通常由Ctrl+C触发signal.SIGTERM:终止请求,默认可以被捕获和处理signal.SIGCHLD:子进程状态改变(终止、暂停等)时触发signal.SIGKILL:强制终止信号(无法被捕获或忽略)signal.SIGSTOP:暂停信号(无法被捕获或忽略)
- 完整信号列表可通过
signal.__dict__查看
处理函数(handler)
handler可以是以下三种类型之一:自定义函数类型:
- 函数需接收两个参数:
signum(信号编号)和frame(当前栈帧对象,可选) - 使用示例:
1
2
3
4
5
6def handle_sigint(signum, frame):
print(f"\n收到信号 {signum},程序即将退出")
exit(0)
# 注册 SIGINT 信号的处理函数
signal.signal(signal.SIGINT, handle_sigint)
- 函数需接收两个参数:
使用默认处理方式 ,即取值
signal.SIG_DFL- 此时表示使用默认处理方式(系统预设行为,如
SIGINT默认终止程序) - 使用示例:
1
2# 恢复 SIGINT 的默认处理(取消自定义函数)
signal.signal(signal.SIGINT, signal.SIG_DFL)
- 此时表示使用默认处理方式(系统预设行为,如
使用忽略该信号处理方式 ,即取值
signal.SIG_IGN- 表示忽略该信号(不做任何处理)
- 使用示例:
1
2# 忽略 SIGINT 信号(Ctrl+C 无效)
signal.signal(signal.SIGINT, signal.SIG_IGN)
使用注意事项
- 信号处理函数应尽量简单,避免包含复杂逻辑(如 I/O 操作、长时间阻塞等),否则可能导致程序不稳定
- 部分信号(如
SIGKILL、SIGSTOP)无法被捕获或忽略,用于强制终止/暂停程序 - 信号处理函数通常在主线程中执行,多线程程序中需谨慎处理信号,避免线程安全问题
- 部分信号(如
SIGCHLD)在 Windows 系统中可能不支持,使用时需注意平台兼容性