Я часто начинаю читать огромный файл, а затем через некоторое время хочу выйти, но есть задержка от нажатия
Ctrl+ Cдо остановки программы. Есть ли шанс сократить отставание, нажав клавишу Ctrl+ Cнесколько раз? Или я трачу свои клавиши?
41
bash
, но не в случае,zsh
когда всегда закрывается родитель. Это одна из причин, по которой мне нравитсяzsh
.^C
когда она регистрирует прессу (по крайней мере, это делает bash)Ответы:
После первого Ctrl-Cпрограмма получит
SIGINT
и, как правило, начнет очистку (удаление файлов tmp, закрытие сокетов и т. Д.). Если вы нажмете еще Ctrl-Cраз, пока это происходит, может случиться так, что вы прервете процедуру очистки (т. Е. Дополнительный сигнал может сработать вместо того, чтобы остаться один), оставив беспорядок. Хотя обычно это не так, чаще всего дополнительные сигналы фактически отправляются после процесс завершил (из-за внутренних задержек во взаимодействии оператора с системой). Это означает, что сигналы получен другим процессом (часто оболочкой, но не всегда). Если этот получатель не обрабатывает этот сигнал должным образом (как обычно это делает оболочка - см. ответ Дженни Д.), вы можете быть неприятно удивлены результатом такого действия.источник
INT
который получает процесс.trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
. Запустите скрипт и дважды нажмите Ctrl-C. Вы увидите, что второй ctrl-C передается подпрограмме «clean» (в операторе trap) и завершает своюsleep
команду.trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
толькоsleep
команды получают сигналы. Мы оба были неправы xDisig
он включен, как только ядро нажмет и получит CTRL-C (для эмулятора терминала, как только эмулятор терминала запишет его на ведущую сторону псевдотерминала), сигнал SIGINT отправляется на все процессы на переднем плане процессов группы терминала. Он может быть заблокирован там, но не будет доставлен позже другому процессу. Даже если буфер терминального устройства заполнен (приложения не читают ничего из того, что вы ввели), CTRL-C будет переходить в очередь.Ты их тратишь. Все, что происходит, это то, что, как только сервер завершит вывод на экран, он получит несколько Ctrl-C. Первый будет использоваться для уничтожения процесса, а следующие будут в вашей оболочке, которая будет выглядеть примерно так:
источник
короткий ответ: если процесс реагирует на это.
Длинный ответ: Когда вы нажимаете ctrl+, cядро посылает сигнал процессу. Какой сигнал можно определить с помощью следующей команды:
Смотрите справочную страницу
stty
:Это сигнал
INT
, также известный как номер 2. Когда процесс имеет обработчик сигнала, он может реагировать на это. Большинство процессов выполняют некоторые задания по очистке для успешного завершения.источник
kernel
(линия дисциплины терминала, терминал водителя) , который посылает SIGINT каждому процессу в процессе переднего плана группы терминала.Вы правы. Клавиши нажимаются впустую. Когда вы нажимаете, Crtl+Cи он обнаруживается, существуют ресурсы, которые необходимо очистить, поэтому для этого требуется время. Я знаю один возможный случай, когда Ctrl+Cтребуется нажатие , - это когда вы хотите отменить процесс обновления Yum, когда Yum требует, чтобы вы Ctrl+Cдважды нажали, чтобы подтвердить, что вы действительно хотите отменить.
источник
Хотя Ctrl-Cв общем случае необходим только один, в некоторых случаях это может быть необходимо. Например, Python перехватывает ловушку, Ctrl-Cкогда создается новый поток, и поэтому, если что-то идет не так в процессе запуска множества потоков, необходимо повторно отправить его несколько раз, чтобы он мог пройти к
python
родительскому процессу без пойманы.источник
Я всегда должен нажимать Ctrlcнесколько раз. У меня никогда не было ответа на первое нажатие, и мне приходилось использовать его несколько раз, пока система фактически не поймет, Ctrlcчто отправляется. Кажется, что он на самом деле пропускает / теряет большинство из них.
источник