Python - 使用'import signal'处理CTRL+D
我现在可以通过下面的代码来处理 CTRL+C 的操作:
def hand_inter(signum, frame):
print 'hey, nice job.'
signal.signal(signal.SIGINT, hand_inter)
不过,我还需要处理 CTRL+D,但是找不到合适的 "signal.CTRL+D" 调用来处理这个信号。
1 个回答
3
Ctrl+D 不是一个信号,它表示输入结束。
如果你在使用一个交互式程序,通常你会在读取用户输入,这时按下 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,是程序无法捕获的。