Python - 使用“导入信号”处理 CTRL+D

5 python signals exception interrupt signal-handling

我目前可以通过以下方式处理CTRL+ C

def hand_inter(signum, frame):
    print 'hey, nice job.'

signal.signal(signal.SIGINT, hand_inter)
Run Code Online (Sandbox Code Playgroud)

但是,我还需要处理CTRL+D但无法找到适合符号的“signal.CTRL+D”调用。

Alo*_*dal 3

Ctrl+D不是信号,它是文件结尾。

如果您有一个交互式程序,您很可能会读取 STDIN,而Ctrl+D是用户表示输入结束的方式。在此上下文之外,它没有任何特殊含义。

之后执行的代码通常是“readline”或类似调用之后的代码。这相当于读取任何其他文件并检测到它已结束并且没有更多数据可供读取 - 相应的调用将为您提供指示。

例如,这可能是一个简单的交互式程序:

import sys

while True:
    line = sys.stdin.readline()    # readline will return "" on EOF
    if line:
        do_something_with(line)    # * if user just pressed Enter line will
                                   #   be "\n", i.e. still True
    else:                          # * user pressed C-D, i.e. stdin has been
        sys.exit(0)                #   closed readline call must have returned ""
Run Code Online (Sandbox Code Playgroud)

另一方面,Ctrl+C是不同的,它是用户告诉终端终止正在运行的进程的方式。它可以在任何时刻出现,无论该过程是否需要输入或什至关心外部世界。

因为进程无法预料到这一点,所以您需要signal设置所谓的陷阱,这是操作系统提供的机制,使进程能够说:“如果您想终止我,请执行此操作......”(这可以是任何东西,包括什么也没有,即只是忽略信号)。异常是像SIGKILL这样的特殊信号,进程无法捕获它们。