Python - обрабатывать CTRL+D с помощью "сигнала импорта"

В настоящее время я могу обрабатывать CTRL+C через:

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

signal.signal(signal.SIGINT, hand_inter)

Однако я также должен обрабатывать CTRL+D, но не могу найти соответствующий вызов signal.CTRL+D для signum.

1 ответ

Решение

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, которые не могут быть обнаружены процессом.

Другие вопросы по тегам