Почему Ctrl-C не уничтожает сам Терминал?

Терминал работает, когда мы открываем его.

luvpreet@DHARI-Inspiron-3542:/$

Я только что открыл его. Так, когда я нажимаю Ctrl+C, почему он не уничтожает себя и закрывает терминал??

39
задан 7 March 2017 в 13:49

5 ответов

Ctrl + C является сигналом прерывания. При вводе этого в терминале удар отправляет SIGINT в задание на переднем плане. Если нет никакого задания (который имеет место, когда Вы только что открыли терминал), ничего не происходит. Программа эмулятора терминала не является заданием, работающим в оболочке, таким образом, это не получает сигнал и не закрывается.

, Если Вы хотите закрыть терминал с клавишей CTRL, используйте Ctrl + D (EOF), который заставляет удар выходить (и закрывает терминал также).

См. также: Руководство Новичка Bash по сигналам и в большей глубине , Как обработка сигнала работает
примечание: этот ответ был отредактирован, так как комментарии были добавлены

48
ответ дан 23 November 2019 в 00:09

Нажатие клавиши ^C , как другие нажатия клавиш*, не является волшебным - оно отправляет код клавиши в то, какой бы ни программа фокусируется. (В X, код клавиши 54 для C с модификатором 0x4 для Ctrl .) Программа это получает поток ключей, ответственно за то, что сделало, что-то соответствующее с ними - помнят, что во многих приложениях GUI, нажатие клавиши копирует в буфер обмена.

, Когда эмулятор терминала GUI (например, Konsole) или виртуальный терминал получает нажатие клавиши, которое он интерпретирует как ^C , это может сделать одну из трех вещей. Если терминал находится в режим без предварительной обработки , то под управлением программа попросила, чтобы терминал не работал любой обработка специальных ключей сама и передал их прямо программе. Некоторые программы, которые поддерживают расширенные функции как редактирование строки, получают ввод с клавиатуры в некоторой конфигурации промежуточные полные необработанные нажатия клавиш и обработанные строки текста; bash, например, получает нажатия клавиш по одному. ^C интерпретируется терминалом, но клавиша Backspace отправляется в оболочку как есть.

Большинство программ, однако, использует режим с обработкой (потому что это не сырые данные), где терминал интерпретирует некоторые основные нажатия клавиш прежде на самом деле отправить их в программу (это - то, почему можно использовать клавишу Backspace в cat). В этом режиме сам терминал переводит нажатие клавиши ^C в SIGINT сигнал и отправляет его в дочерний процесс. Так как терминал сгенерировал сигнал, он не запутается и завершится.

  • SysRq действительно является волшебным.
32
ответ дан 23 November 2019 в 00:09

^C обычно отображается (см. stty -a) к SIGINT сигнал (см. man 7 signal).

непойманное SIGINT прерывания рабочий процесс, НО...

SIGINT один из сигналов, что процесс может указать поведение для ("Ловля сигнала").

, Что Вы называете "терминальными" выгодами SIGINT и возвращаетесь к работе.

8
ответ дан 23 November 2019 в 00:09

Когда я был новичком, я пропускал часть, что, когда я использовал командную строку, я на самом деле использовал две отдельных программы, терминал и оболочку (например, удар)

, оболочка - то, что Вы уже, вероятно, знаете, программа, которая берет в качестве входных команд или сценариев, выполняет их и печатает их вывод.

терминал с другой стороны похож на человека в середине между пользователем и программой (какая программа обычно является оболочкой как удар или рыба). То, что делает терминал, должно считать вход, например, из клавиатуры, возможно, обработать тот вход в некотором роде и перенаправить его к другой программе (удар).

Также это работает в другом слишком, когда другая программа производит что-то, что что-то перенаправляется к терминалу, затем это - задание терминала для вывода этого что-то на экран. Промежуточный вводимый и печатающий его на экран терминал может интерпретировать вход, который это получает различными путями.

, Например, если программа производит следующую последовательность:

\e[0;31m some extra foobar text

терминал выведет на экран "некоторый дополнительный foobar текст" с красными буквами. Это вызвано тем, что терминал принимает решение рассматривать тот странный код специальным способом , которые кодируют подсказки он для печати следующего вывода красного цвета.

Так же, когда пользователь нажимает Ctrl - C, единственная специальная вещь об этом состоит в том, что терминал принимает решение рассматривать его специальным способом, нет ничего другого специального предложения об этом сочетании клавиш. Конкретно это подсказывает он отправленному сигнал прерывания (SIGINT) к процессу, который работает в терминале, который является оболочкой. Если в тот момент существует какая-либо программа, которая была порождена оболочкой и в настоящее время работает на переднем плане, она также получает сигнал. Теперь оболочка имеет специальный обработчик для этого сигнала, и ничего не происходит. Но большинство программ имеет обработчики по умолчанию, которые в случае SIGINT просто выходят.

7
ответ дан 23 November 2019 в 00:09

Каждому сигналу связали действие по умолчанию с ним. Действие по умолчанию для сигнала является действием, которое выполняют сценарий или программа, когда это получает сигнал.

Ctrl+C отправляет сигнал "прерывания" (SIGINT), который значения по умолчанию к завершению процесса к заданию, работающему на переднем плане.

Ctrl+D говорит терминалу, что он должен зарегистрировать EOF на стандартном входе, который удар интерпретирует как требование выйти.

Процесс может принять решение проигнорировать сигнал INT, и Bash делает так, когда он работает в интерактивном режиме.

Из руководства:

То, когда удар является интерактивным, в отсутствие любых прерываний, он игнорирует SIGTERM (так, чтобы уничтожили 0, не уничтожает интерактивную оболочку), и SIGINT пойман и обработан (так, чтобы встроенное ожидание было прерываемо). Во всех случаях удар игнорирует SIGQUIT. Если управление заданиями в действительности, удар игнорирует SIGTTIN, SIGTTOU и SIGTSTP.


Поймите это с прерыванием:

прерывание является функцией, встроенной в оболочку, которая отвечает на аппаратные сигналы и другие события. Это определяет и активирует обработчики, которые будут выполнены, когда оболочка получает сигналы или другие особые условия.

trap [-lp] [arg] [sigspec …]

-l распечатайте список имен сигнала и их соответствующих чисел.
-p отобразите команды прерывания, связанные с каждым SIGNAL_SPEC.

аргумент должен быть считан и выполнен, когда оболочка получает сигнал sigspec. Каждый sigspec является или именем сигнала или числом сигнала. Имена сигнала нечувствительны к регистру, и префикс SIG является дополнительным.

Если sigspec 0 или ВЫХОД, аргумент выполняется, когда оболочка выходит. Для понимания этого закройте терминал и откройте его после редактирования после строки в .bashrc файл.

trap 'notify-send "Ctrl D pressed"' 0

Ctrl D подобен exit управляйте для выхода от терминала.

Если Вы хотите, чтобы Bash вышел после получения сигнала INT, даже в интерактивном режиме, можно добавить следующее к Вашему ~/.bashrc:

trap 'exit' INT

или

trap 'exit' 2
5
ответ дан 23 November 2019 в 00:09

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

Похожие вопросы: