1

Я знаю, почему ctrl+c убивает программу; Меня больше интересует история о том, почему "c" было выбрано над другими буквами, учитывая, что оно (по-видимому) не имеет смыслового значения.

Если кто-нибудь знает историю, стоящую за этим (и другие, такие как ctrl+d для EOF), это было бы здорово.

1 ответ1

5

Первоначально опубликовано на Unix.stackexchange.com, но я не могу проголосовать за этот ответ, поэтому это копия:

Значение Ctrl+C «убить» очень старое, я думаю, даже старше, чем Unix. Википедия восходит к TOPS-10, который датируется концом 1960-х годов. В статье объясняется, почему Ctrl+C был разумным выбором: в ASCII, который был опубликован в 1963 году, соответствующий символ - ETX, конец текста. Отсутствие символа, означающего «стоп» ¹, символ, означающий «этот сегмент ввода окончен», был разумным выбором для обозначения «остановить текущую обработку».

«Копирование» означает Ctrl+C от Xerox PARC, изобретателя copy-paste в его современной форме (и большинства других основ графического пользовательского интерфейса). Я не знаю точно, когда это было, но это должно было быть в конце 1970-х. В этой теме, посвященной обмену стеками пользовательского опыта, обсуждается выбор привязок клавиш; C для копирования имеет большой смысл.

У PARC было мало причин отклонять Ctrl+C для копирования на основании существующего значения в терминалах TOPS-10 и Unix. Тогда операционные системы и приложения были более разнообразными, и гораздо меньше людей использовали компьютеры; не было ни возможности, ни призывать к единому стандарту для привязки клавиш во всех приложениях. Другие варианты использования Ctrl+C в популярных приложениях включают в себя перелистывание страниц в WordStar ² и специфичные для режима команды в Emacs. Все они были разработаны независимо для приложений с часто разными требованиями, работающих в разных средах.

Вы можете настроить привязку клавиш терминала с помощью команды stty. Привязки терминала активны, когда терминал находится в режиме приготовления³. Например, команда stty intr ^G устанавливает символ, который отправляет сигнал SIGINT на Ctrl+G вместо Ctrl+C. Символ ^G - BEL в ASCII; при отправке на терминал это означает «позвонить в звонок». Это символ, который Emacs использует для «прерывания текущей операции» (обоснование: приложение отправляет BEL пользователю через терминал для прерывания пользователя; пользователь отправляет BEL приложению через терминал для прерывания приложения). Он не имеет стандартного значения при отправке в терминал.

Большинство оболочек предоставляют функции редактирования строк, поэтому они устанавливают терминал в сырой режим. Так делают приложения в полноэкранном текстовом режиме. Возможно, вам придется настроить эти приложения для распознавания Ctrl+G вместо Ctrl+C, а некоторые могут иметь ненастраиваемые привязки клавиш. Таким образом, изменение символа прерывания может или не может быть практически осуществимо в зависимости от того, какие приложения вы используете.

Другой подход может состоять в том, чтобы сконфигурировать ваш терминал для изменения последовательности байтов, которую он отправляет для сочетания клавиш Ctrl+C, или заставить его ничего не отправлять и вместо этого выполнять операцию копирования. Вы также можете выбрать другую комбинацию клавиш для отправки Ctrl+C (если у вас не клавиатура ПК, не принадлежащая ноутбуку, вы можете использовать необычную клавишу Pause/Break ). Не все терминалы могут быть настроены таким образом.

¹ Ctrl-S (XOFF) означает остановку, но она адресована терминалу, а не приложению. ² Рядом с Ctrl+X для следующей строки, с Ctrl+E и Ctrl+R для предыдущей строки и страницы; Эти клавиши были выбраны из-за их размещения на QWERTY-клавиатуре. ³ Nitpick: приготовленный режим - это набор настроек терминала, включая интерпретацию нескольких символов, в том числе тот, который посылает сигнал прерывания.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .