Ответ для 2-го вопроса в случае bash
или zsh
: declare -f
.
После первого Ctrl-C программа получит SIGINT
и обычно начинает мыться (удаляющий tmp файлы, закрывая сокеты, и т.д.). При ударе Ctrl-C снова, в то время как это продолжается, это может произойти, что Вы прерываете стандартную программу уборки (т.е. вместо дополнительного сигнала можно было бы реагировать того, чтобы быть оставленным в покое), оставляя путаницу. В то время как это обычно не имеет место, чаще всего дополнительные сигналы на самом деле отправляются после законченного процесса (из-за свойственных задержек взаимодействия оператора с системой). Это означает, что сигналы получены другим процессом (часто оболочка, но не всегда). Если тот получатель не обрабатывает этот сигнал правильно (как оболочка, обычно делает - видят ответ D Jenny), Вы можете быть неприятно удивлены результатом такого действия.
Вы тратите впустую их. Все, что происходит, - то, что, после того как сервер заканчивается с экранным выводом, он примет несколько Ctrl-C. Первый будет использоваться для уничтожения процесса, и следующие закончатся в оболочке, которая затем посмотрит что-то как
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$
Вы правы. Нажатия клавиш тратятся впустую. Когда Вы нажимаете Crtl+C, и он обнаруживается, существуют ресурсы, которые должны быть очищены, который является, почему он занимает время. Один возможный случай, который я знаю, где нажатие Ctrl+C требуется, когда Вы хотите отменить Вкусный процесс обновления, где Конфетка требует, чтобы Вы нажали Ctrl+C дважды, чтобы подтвердить, что Вы действительно хотите отменить.
Короткий ответ: Если процесс реагирует на него.
Длинный ответ: при ударе ctrl+c, ядро отправляет сигнал в процесс. Какой сигнал может быть определен следующей командой:
user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
См. страницу справочника stty
:
intr CHAR
CHAR will send an interrupt signal
Это - сигнал INT
, также известный как номер 2. Когда процесс имеет обработчик сигналов, он может реагировать на это. Большинство процессов делает некоторые работы очистки для окончания успешно.
kernel
(протокол работы линии терминала, терминального драйвера), который отправляет SIGINT в каждый процесс в группе приоритетного процесса терминала.
– Stéphane Chazelas
15.01.2014, 12:07
Хотя только один Ctrl-C необходим в общем случае, существуют некоторые ситуации, где это может быть необходимо. Python, например, захватывает Ctrl-C, когда новый поток порождается, и поэтому если что-то идет не так, как надо посреди запуска многих потоков, необходимо снова послать его многократно для него для получения до python
родительский процесс без того, чтобы быть пойманным.
Я всегда должен нажимать Ctrlc многократно. У меня никогда не было его, отвечают на первом нажатии и должны использовать его многократно, пока система на самом деле не понимает, что существует отправляемый Ctrlc. Кажется, как будто это на самом деле пропускает/теряет большинство из них.
INT
то, что процесс получает. – chaos 15.01.2014, 10:18trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
. Запустите скрипт и поразите ctrl-C дважды. Вы будете видеть, что второй ctrl-C передается стандартной программе "уборки" (в операторе прерывания) и завершаетsleep
команда. – John1024 15.01.2014, 10:43trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
Это простоsleep
команды, которые получают сигналы. Мы были оба неправильным xD – chaos 15.01.2014, 10:53isig
идет, как только CTRL-C нажат и получен ядром (для эмулятора терминала, как только эмулятор терминала пишет это в основную сторону псевдотерминала), сигнал SIGINT отправляется во все процессы в группе приоритетного процесса терминала. Это может быть заблокировано там, но это не будет поставленным позже другому процессу. Даже если буфер оконечного устройства полон (приложения не считали ни одной из вещей, которые Вы ввели), CTRL-C пройдет, минуя очередь. – Stéphane Chazelas 15.01.2014, 13:05