Python - 用'导入信号'处理CTRL + D

时间:2014-03-07 17:48:54

标签: python exception-handling signals interrupt signal-handling

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

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

signal.signal(signal.SIGINT, hand_inter)

但是我还需要处理 CTRL + D 但找不到相应的“signal.CTRL + D”调用signum。

1 个答案:

答案 0 :(得分:2)

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 ""

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

因为进程无法预料到这一点,所以需要signal来设置所谓的陷阱,这是操作系统提供的机制,使进程能够说“如果你想终止我,请只是改为执行此操作......“(可能是任何事情,包括什么都没有,即只是忽略信号)。例外是像SIGKILL这样的特殊信号,这些信号无法被进程捕获。