在Python

时间:2017-06-27 14:50:32

标签: python linux signals posix

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

问题:

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

2 个答案:

答案 0 :(得分:0)

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(如果它不是当前进程的ID)。

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

答案 1 :(得分:0)

您应该使用标准库中的signalHere就是一个例子。 通常,您为特定信号指定处理程序,即:

import signal
import time
import sys

def handler(signum, frame):
    print(signum, frame)
    sys.exit(1)

signal.signal(signal.SIGINT, handler)

while True:
    time.sleep(1)

因此,当您按下C-c时,handler以信号编号和当前堆栈帧作为参数运行(如果您不退出,则程序继续执行)。您可以以相同的方式捕获其他信号(signal.SIGHUP等)。 例如,要处理用户保留的信号,您可以使用signal.signal(signal.SIGUSR1, handler),然后使用终端中的kill -USR1 <pid>