Терминал работает, когда мы его открываем.
luvpreet@DHARI-Inspiron-3542:/$
Я только что открыл его. Итак, когда я нажимаю Ctrl + C, почему он не убивает себя и не закрывает терминал ??
Клавиша ^ C, как и другие нажатия клавиш *, не является магии - она отправляет код ключа в зависимости от того, какая программа имеет фокус. (В X ключевой код равен 54 для C с модификатором 0x4 для Ctrl.) Программа, получающая поток ключей, отвечает за выполнение чего-то соответствующего с ними - помните, что во многих приложениях с графическим интерфейсом нажатие клавиши копирует Буфер обмена.
Когда эмулятор терминала GUI (например, Konsole) или виртуальный терминал получает нажатие клавиши, которое он интерпретирует как ^ C , он может выполнять одну из трех задач. Если терминал находится в сыром режиме, тогда запущенная программа попросила терминал не выполнять обработку специальных клавиш и передавать их прямо в программу. Некоторые программы, поддерживающие расширенные функции, такие как редактирование строк, получают ввод с клавиатуры в некоторой конфигурации между полными исходными нажатиями клавиш и обработанными линиями текста; bash, например, получает нажатия клавиш по одному за раз. ^ C интерпретируется терминалом, но ключ backspace отправляется в оболочку as-is.
Большинство программ, однако, используют режим raw mode (поскольку он не является сырым ), где терминал интерпретирует некоторые основные нажатия клавиш, прежде чем отправлять их в программу (поэтому вы можете использовать backspace в cat). В этом режиме сам терминал преобразует нажатие ^ C в сигнал SIGINT и отправляет его дочернему процессу. Поскольку терминал сгенерировал сигнал, он не запутается и не завершится.
SysRq действительно волшебный.^ C обычно отображается (см. stty -a) на сигнал SIGINT (см. man 7 signal).
Неиспользуемый SIGINT прерывает текущий процесс, BUT ...
SIGINT является одним из сигналов, которые процесс может определять поведение для («Улавливание сигнала «).
То, что вы называете «терминал», ловит SIGINT и возвращается к работе.
Когда я был новичком, мне не хватало той части, что когда я использовал командную строку, я фактически использовал две отдельные программы, терминал и оболочку (например, bash)
Оболочка - это то, что вы уже, наверное, знаете, программа, которая принимает в качестве входных команд или скриптов, выполняет их и выводит их вывод.
Терминал с другой стороны похож на человека посередине между пользователем и программой (какая программа обычно представляет собой оболочку, такую как bash или рыба). То, что делает терминал, - это прочитать ввод, например, с клавиатуры, возможно, обработать этот вход каким-либо образом и перенаправить его на другую программу (bash).
Также это работает и в другом режиме, когда другая программа выдает что-то, что-то перенаправляется на терминал, тогда задание терминала выводит что-то на экран.
Например, если программа выводит следующую последовательность:
\e[0;31m some extra foobar text
Терминал выведет на экран «некоторый дополнительный текст foobar» с красными цветными буквами. Это связано с тем, что терминал решает обработать этот странный код специальным образом, который указывает на то, что он печатает следующий вывод красным цветом.
Аналогично, когда пользователь нажимает Ctrl - C, единственная особенность в этом случае что терминал решает относиться к нему особым образом, в этой ключевой последовательности нет ничего особенного. В частности, это намекает на то, чтобы передать сигнал прерывания (SIGINT) в процесс, который выполняется внутри терминала, то есть оболочка. Если в этот момент существует любая программа, которая была порождена оболочкой и в настоящее время запущена на переднем плане, она также получает сигнал. Теперь у оболочки есть специальный обработчик для этого сигнала, и ничего не происходит. Но у большинства программ есть обработчики по умолчанию, которые в случае SIGINT просто выходят.
Каждый сигнал имеет действие по умолчанию, связанное с ним. Действие по умолчанию для сигнала - это действие, которое выполняет скрипт или программа, когда он получает сигнал.
Ctrl + C посылает сигнал «прерывания» (SIGINT), по умолчанию которого завершается процесс на задание
Ctrl + D сообщает терминалу, что он должен регистрировать SIGINT на стандартном входе, который bash интерпретирует как желание выйти .
Процесс может игнорировать сигнал INT, а Bash делает это, когда он работает в интерактивном режиме.
Из руководства:
Когда bash в интерактивном режиме, при отсутствии каких-либо ловушек, он игнорирует SIGTERM (так что kill 0 не убивает интерактивную оболочку), а SIGINT поймается и обрабатывается (так, что ожидания встроены в прерывание). Во всех случаях bash игнорирует SIGQUIT. Если управление заданиями действует, bash игнорирует SIGTTIN, SIGTTOU и SIGTSTP.manual - это функция, встроенная в оболочку, которая реагирует на аппаратные сигналы и другие события.
trap [-lp] [arg] [sigspec …]
Когда bash является интерактивным, при отсутствии каких-либо ловушек он игнорирует SIGTERM (так что kill 0 не убивает интерактивную оболочку), и SIGINT улавливается и обрабатывается (так, что wait builtin прерывается). Во всех случаях bash игнорирует SIGQUIT. Если управление заданиями действует, bash игнорирует SIGTTIN, SIGTTOU и SIGTSTP.
arg должны считываться и выполняться, когда оболочка получает сигнал sigspec. Каждый sigspec является либо именем сигнала, либо номером сигнала. Имена сигналов нечувствительны к регистру, а префикс SIG является необязательным.-l распечатать список имен сигналов и их соответствующих номеров. -p отображает команды ловушки, связанные с каждым SIGNAL_SPEC.
trap 'notify-send "Ctrl D pressed"' 0
Если sigspec выходит или EXIT, arg выполняется, когда оболочка завершается. Чтобы понять это, закрыть терминал & amp; откройте его после редактирования следующей строки в файле .bashrc.
Ctrl D аналогично команде exit для выхода из терминала.
trap 'exit' INT
Если вы хотите, чтобы Bash выходил из получая сигнал INT, даже в интерактивном режиме, вы можете добавить следующее к вашему ~/.bashrc:
trap 'exit' 2