python - 在 Python 中捕获 SIGINT 以外的信号

标签 python linux signals posix

我正在编写一个交互式 Python CLI 工具。当发出特定信号时,我想让该工具进入“特殊文本输入模式”。我目前正确处理 SIGINT 并正常退出。

问题:

  1. 我应该使用什么信号进入这个模式? (不妨碍其他功能的东西)
  2. 捕获此信号的最佳方法是什么?
  3. 这个信号在 POSIX 系统中是如何触发的?在 Windows 中有什么不同吗?

最佳答案

POSIX 恰好指定了两个用户定义信号:

SIGUSR1 = 30
SIGUSR2 = 31

这两个信号不会由任何操作触发,这意味着您可以明确地为它们定义处理程序并根据您的目的发出这些信号。

import signal

def handler(signum):
   if signum == signal.SIGUSR1:
       print('user defined interrupt!')

signal.signal(signal.SIGUSR1, handler)

这些信号已明确提供给用户,因此最好在您的应用程序中引发和处理这些信号。


要使用代码显式地发出此信号,您​​必须使用:

import os
os.kill(os.getpid(), signal.SIGUSR1)

其中os.getpid()返回当前进程的进程ID。将其替换为您希望终止的进程的 ID(如果它不是当前进程的话)。

此外,我应该提到 SIGUSR1/2 在 Windows 中不受支持。文档提到,除了 SIGABRTSIGFPESIGILLSIGINTSIGSEGV,或 SIGTERM,不能发出其他信号。在任何其他情况下都会引发 ValueError。

关于python - 在 Python 中捕获 SIGINT 以外的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44783409/

相关文章:

class - UML 类图中信号的正确设计是什么?

python - Pickle - 如果存在则加载变量或创建并保存它

linux - *.so.*.* 库是什么

python - django一次提交表单多次输入相同的名称

linux - 在一个命令中动态终止多个 Mac OS 进程?

linux - Linux 中是否有任何标准的退出状态代码?

linux - Cygwin:中断阻塞读取

python - 有关 QPushButton 的信号/槽的更多信息

python - 如何使用 lambda/maps 从字典中获取列表?

python - 我如何防止 PyCharm 在我每次开始一个新项目时都创建一个 virtualenv?