Разве нажимающий ctrl-c несколько раз делает под управлением программу близко более быстро?

Ответ для 2-го вопроса в случае bash или zsh: declare -f.

41
16.01.2014, 01:23
6 ответов

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

35
27.01.2020, 19:35
  • 1
    Почему это должно прервать стандартную программу уборки? Это - просто другой сигнал INT то, что процесс получает. –  chaos 15.01.2014, 10:18
  • 2
    @chaos, Почему должен он? Это должно, если стандартная программа уборки добралась, завис, и Вы хотите остановить его. Это на самом деле прокладывает себе путь? Да, довольно часто. Можно продемонстрировать это достаточно просто: сделайте сценарий удара с одной строкой trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Запустите скрипт и поразите ctrl-C дважды. Вы будете видеть, что второй ctrl-C передается стандартной программе "уборки" (в операторе прерывания) и завершает sleep команда. –  John1024 15.01.2014, 10:43
  • 3
    @John1024, теперь я вижу его. Спасибо за сценарий snippet^^, Но, не отменяется очистка, см.: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10 Это просто sleep команды, которые получают сигналы. Мы были оба неправильным xD –  chaos 15.01.2014, 10:53
  • 4
    Это неправильно. Доставка сигнала синхронна. Если isig идет, как только CTRL-C нажат и получен ядром (для эмулятора терминала, как только эмулятор терминала пишет это в основную сторону псевдотерминала), сигнал SIGINT отправляется во все процессы в группе приоритетного процесса терминала. Это может быть заблокировано там, но это не будет поставленным позже другому процессу. Даже если буфер оконечного устройства полон (приложения не считали ни одной из вещей, которые Вы ввели), CTRL-C пройдет, минуя очередь. –  Stéphane Chazelas 15.01.2014, 13:05
  • 5
    Да, как пример, VLC интерпретирует несколько сигналов Ctrl+C как способ выйти грязно, тогда как единственный Ctrl+C попытается выйти чисто. –  Jeremy Visser 16.01.2014, 01:05

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

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 
11
27.01.2020, 19:35
  • 1
    Процесс не обязательно выходит при отправке ему SIGINT. Это могло остаться в живых неограниченно долго и сделать что-то другое каждый раз, когда Ctrl+C нажимается. –  Brian Gordon 15.01.2014, 21:44
  • 2
    Верный. Я делал предположения о том, как пользователь читает файл. –  Jenny D 16.01.2014, 10:45

Вы правы. Нажатия клавиш тратятся впустую. Когда Вы нажимаете Crtl+C, и он обнаруживается, существуют ресурсы, которые должны быть очищены, который является, почему он занимает время. Один возможный случай, который я знаю, где нажатие Ctrl+C требуется, когда Вы хотите отменить Вкусный процесс обновления, где Конфетка требует, чтобы Вы нажали Ctrl+C дважды, чтобы подтвердить, что Вы действительно хотите отменить.

4
27.01.2020, 19:35

Короткий ответ: Если процесс реагирует на него.

Длинный ответ: при ударе 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. Когда процесс имеет обработчик сигналов, он может реагировать на это. Большинство процессов делает некоторые работы очистки для окончания успешно.

5
27.01.2020, 19:35
  • 1
    Ctrl-Z обычно отправляет SIGTSTP, который может быть обработан (в отличие от SIGSTOP). –  peterph 15.01.2014, 10:33
  • 2
    Нет, это не оболочка, которая отправляет SIGINT в процесс. Это kernel (протокол работы линии терминала, терминального драйвера), который отправляет SIGINT в каждый процесс в группе приоритетного процесса терминала. –  Stéphane Chazelas 15.01.2014, 12:07
  • 3
    Будущие читатели, также см. unix.stackexchange.com/a/120071/135943. выпуск 5.0.0 –  Wildcard 12.03.2017, 10:01

Хотя только один Ctrl-C необходим в общем случае, существуют некоторые ситуации, где это может быть необходимо. Python, например, захватывает Ctrl-C, когда новый поток порождается, и поэтому если что-то идет не так, как надо посреди запуска многих потоков, необходимо снова послать его многократно для него для получения до python родительский процесс без того, чтобы быть пойманным.

2
27.01.2020, 19:35
  • 1
    Это происходит со мной время от времени, когда я создаю многопоточные/обработанные сценарии Python. Иногда несколько нажатий необходимы, прежде чем основной процесс уничтожается. –  Leo 16.01.2014, 08:11

Я всегда должен нажимать Ctrlc многократно. У меня никогда не было его, отвечают на первом нажатии и должны использовать его многократно, пока система на самом деле не понимает, что существует отправляемый Ctrlc. Кажется, как будто это на самом деле пропускает/теряет большинство из них.

0
27.01.2020, 19:35

Теги

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