signal — 为异步事件设置处理程序

源代码: Lib/signal.py


此模块提供在 Python 中使用信号处理程序的机制。

一般规则

The signal.signal() 函数允许定义要执行的自定义处理程序,当收到信号时。有安装少量默认处理程序: SIGPIPE 被忽略 (因此,可以将在管道和套接字中写入错误报告成普通 Python 异常) 和 SIGINT 被翻译成 KeyboardInterrupt 异常若父级进程没有改变它。

特定信号处理程序一旦设置,仍会安装直到被明确重置 (Python 模拟 BSD 风格接口,不管底层实现),除了异常处理程序 SIGCHLD 遵循底层实现。

On WebAssembly platforms, signals are emulated and therefore behave differently. Several functions and signals are not available on these platforms.

Python 信号处理程序的执行

Python 信号处理程序在低级 C 信号处理程序内,不会获得执行。相反,低级信号处理程序设置标志告诉 虚拟机 稍后要执行相应 Python 信号处理程序 (例如下一 bytecode 指令)。这有后果:

  • 它使捕获同步错误变得意义不大像 SIGFPE or SIGSEGV 是由 C 代码中的无效操作造成的。Python 将从信号处理程序返回到 C 代码,很可能再次引发相同信号,导致 Python 被明显挂起。从 Python 3.3 起,可以使用 faulthandler 模块报告同步错误。

  • 以纯 C 实现的长时间运行的计算 (例如:正则表达式匹配大量文本) 可以在任意时间内不间断运行,不管收到什么信号。将调用 Python 信号处理程序当计算完成时。

  • 若处理程序引发异常,它会在主线程中被 "无中生有" 引发。见 下文注意事项 了解讨论。

信号和线程

Python 信号处理程序始终在主解释器的主 Python 线程中执行,即使信号是在另一线程中收到的。这意味着不可以把信号,用作线程间的通信手段。可以使用同步原语来自 threading 模块代替。

此外,只允许主解释器的主线程设置新的信号处理程序。

模块内容

3.5 版改变: 信号 (SIG*),处理程序 ( SIG_DFL , SIG_IGN ) and sigmask ( SIG_BLOCK , SIG_UNBLOCK , SIG_SETMASK ) 下面列出的相关常数被转换成 enums ( Signals , Handlers and Sigmasks 分别)。 getsignal() , pthread_sigmask() , sigpending() and sigwait() 函数返回人类可读的 enums as Signals 对象。

signal 模块定义了 3 个枚举:

class 信号。 信号

enum.IntEnum collection of SIG* constants and the CTRL_* constants.

Added in version 3.5.