Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-handlectrl+;D带有';输入信号&x27;_Python_Exception Handling_Signals_Interrupt_Signal Handling - Fatal编程技术网

Python-handlectrl+;D带有';输入信号&x27;

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”或类似调用之后的代码。这相当于读取任何其他文件并检测到它已结束,并且没有更多数据可读取——相应的调用将为您提供这方面的指示 例如,这可能是一个简单的交互

我目前可以通过以下方式处理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 ""