Python-handlectrl+;D带有';输入信号&x27;
我目前可以通过以下方式处理CTRL+C: 但是,我还需要处理CTRL+D,但无法找到signum的适当“signal.CTRL+D”调用。CTRL+D不是信号,而是文件的结尾 如果您有一个交互式程序,您很可能正在阅读STDIN,而用户表示输入结束的方式是Ctrl+D。在此上下文之外,它没有任何特殊含义 在此之后执行的代码通常是“readline”或类似调用之后的代码。这相当于读取任何其他文件并检测到它已结束,并且没有更多数据可读取——相应的调用将为您提供这方面的指示 例如,这可能是一个简单的交互式程序:Python-handlectrl+;D带有';输入信号&x27;,python,exception-handling,signals,interrupt,signal-handling,Python,Exception Handling,Signals,Interrupt,Signal Handling,我目前可以通过以下方式处理CTRL+C: 但是,我还需要处理CTRL+D,但无法找到signum的适当“signal.CTRL+D”调用。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是不同的,这是用户告诉终端终止运行进程的方式。它可以在任何时候出现,无论过程是否要求输入,甚至是否关心外部世界
因为进程没有办法预料到这一点,所以您需要
信号
来设置所谓的陷阱,这是操作系统提供的一种机制,用于启用进程,例如,“如果您想要终止我,请改为执行此操作…”(可以是任何内容,不包括任何内容,即忽略信号)。异常情况是特殊信号,如SIGKILL,无法被进程捕获。我正在实现一个聊天服务器,客户端代码在连接时积极侦听,并在按下“enter”时发送消息。我必须用“CTRL-D”命令终止连接。@JoeyDiNardo看我的例子。(由于我是从头开始写的,所以可能会有bug,但你明白了…:)嗯,对于sys.exit(),按ctrl+d似乎什么都不做。当我将它设置为“打印‘测试’”时,它工作得完美无缺。我有一个单独的线程,这可能是问题吗msg=sys.stdin.readline()如果msg:s.send(msg)prompt()或者:sys.exit()
奇怪,我刚刚复制了我的代码,添加了一些东西。。。而且效果很好。也许可以尝试编写一个简单的文本文件,并使用shell重定向将其发送到stdin,比如/script.py
如果您使用线程(因为您说它是用于网络,我猜您使用的是Python的线程TCP服务器),那么原始代码可能无法工作,因为例如,一个线程可能会等待另一个线程等等。。。变得有点复杂。:)
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 ""