Программа ed
, минимальный текстовый редактор, не может быть закрыта, посылая ей прерывание через использование Ctrl- Cвместо того, чтобы печатать сообщение об ошибке «?» на консоль. Почему ed
просто не выйти, когда получит прерывание? Конечно, нет никаких причин, почему загадочное сообщение об ошибке здесь более полезно, чем просто выход. Такое поведение приводит многих новых пользователей к следующему виду взаимодействия:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Такие трагические отходы - их легко избежать, если ed
согласиться на прерывание.
Другая упрямая программа, демонстрирующая подобное поведение, less
также не имеет особых причин для игнорирования C-c
. Почему эти программы не принимают подсказки?
Ответы:
Ctrl+ Cотправляет SIGINT . Обычное действие для SIGINT - возврат к циклу верхнего уровня программы, отмена текущей команды и переход в режим, в котором программа ожидает следующую команду. Только неинтерактивные программы должны умереть от SIGINT.
Поэтому естественно, что Ctrl+ Cне убивает ed, но заставляет его возвращаться в цикл верхнего уровня. Ctrl+ Cпрерывает текущую строку ввода и возвращает к приглашению ed.
То же самое касается меньшего: Ctrl+ Cпрерывает текущую команду и возвращает вас к ее командной строке.
По историческим причинам Эд игнорирует SIGQUIT ( Ctrl+ \). Обычные приложения не должны перехватывать этот сигнал и позволять завершать себя, с дампом ядра, если он включен.
источник
Unix V7
ed(1)
исходный код является примитивной 1762-линией C программой всего лишь несколько замечаний, один из которых это высоко поучительного заголовка комментарий:Учитывая, что сам исходный код не дает никакого обоснования, вы получите его только от автора программы.
ed
Первоначально он был написан Кеном Томпсоном в сборке PDP-11 , но вам действительно нужно было поговорить с тем, кто перенес его на C. Это мог быть Деннис Ритчи , так как он создал C для Unix и был одним из многих, кто использовал C для сделать Unix переносимым на машины без PDP. Доктора Ритчи больше нет рядом, чтобы отвечать на такие вопросы.Мое чтение кода предполагает, что это было сделано для того, чтобы попытаться сохранить содержимое основной копии отредактированного документа. Вы заметите, что другие текстовые редакторы также не умирают Ctrl-C.
Вот что
ed
делает на Ctrl-C:(Да, K & R C. Нам не нужны никакие идентификаторы возвращаемых типов или объявления параметров).
Переведено на английский
ed
:Перерегистрирует обработчик сигнала.
(Unix не получал сигналы автоматического сброса до 4.3BSD , в середине 1980-х.)
Записывает новую строку и запоминает, что это так, через глобальную переменную
lastc
.(
ed.c
имеет около шестидесяти глобальных переменных.)Вызывает
error()
функцию, которая классно делает немного больше, чем печать?
, с точки зрения пользователя.Другими словами, он говорит: «Вы действительно не хотели этого делать?»
источник
error(s)
вed.c
, чтобы вернуться в основной цикл обработки. Это делается с помощьюlongjmp()
звонка. дрожьed
Как и другие интерактивные программы, используйте Ctrl+ Cдля прерывания задач самой программы.Это очень похоже на обычный случай, когда он прерывает задачу, выполняемую в оболочке, - команду.
С точки зрения пользователя, оба варианта очень похожи. Обработка сигнала отличается: в обычном случае сигнал
SIGINT
отправляется процессу переднего плана, выполняющейся команде, и команда обрабатывает его, завершаясь.В случае
ed
, сигнал отправляется на передний план процесса,ed
экземпляр. Если задание выполняетсяed
, оно прерывается и отображается приглашение. Если задание не выполняется, ничего не меняется.Обратите внимание, что оболочка также не выходит на Ctrl+ C, как
ed
. И что это действительно выход на Ctrl+ D. Опять какed
источник
Есть три сигнала, которые
ed
заботятся о:INT
HUP
QUIT
В спецификации POSIX
ed
говорится следующее:Поэтому, какую бы реализацию
ed
вы ни использовали, она соответствует спецификации POSIX в отношенииINT
сигнала (который и Ctrl+Cотправляет).В этом отношении редактор ведет себя как интерактивная оболочка, которая также не завершается при получении
INT
сигнала. Другие редакторы, такие какvi
иnano
делает то же самое.источник
ed
доступных мне источниках . Он ведет себя так же, как и оболочка, которая также не заканчивается при полученииINT
сигнала.