Почему Ctrl + C был выбран, чтобы убить процесс?

342
jhpratt

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

Если кто-то знает историю этого (и других, например, ctrl+dEOF), это было бы здорово.

0
На самом деле это были CTRL + Break и были добавлены ctrl + c, где break - это мягкий терминатор, а c - жесткий терминатор. Если память мне не изменяет, клавиша прерывания такая же, как на экране печати, но это также может быть пауза. Я знал, почему это было c. Это была аббревиатура чего-то, но это так давно. LPChip 6 лет назад 1
Я всегда предполагал, что это было для "близко". к сожалению, иронично, поскольку ваш вопрос, скорее всего, будет закрыт по соображениям мнения, поскольку нетехнические вопросы «почему», как правило, невозможно решить. Frank Thomas 6 лет назад 0
@FrankThomas Конечно, есть возможность быть закрытым. Я бы не сказал, что это основано на мнении, поскольку это исторический вопрос, но это решение не от меня. jhpratt 6 лет назад 1
Когда вопрос закрыт как основанный на мнении, он относится к людям, которые дают ответ на основании своего мнения, потому что нет никакого технического документа, на который можно было бы ссылаться, чтобы доказать, что он прав. Поиск в Google для CTRL-C CTRL-Break действительно дает много результатов, но мне трудно найти что-нибудь, что объясняет, почему был выбран C. Пока что этот ответ, кажется, объясняет это лучше всего: https://unix.stackexchange.com/questions/245421/ctrlc-copy-or-interrupt LPChip 6 лет назад 0
Посмотрите на _значение_ низких кодов ASCII (см. Http://www.asciitable.com) - Ctrl-C было 0x03, ETX, END OF TEXT. В ранних клавиатурах клавиши ctrl, shift и meta (теперь ALT) использовались как простые индикаторы «принудительно переводить биты в 0 или 1», поэтому для генерации 0x03 6-битный (0x40) был принудительно установлен на низкое значение, а клавиша C была нажата, потому что при свободном 6-битном ключе будет 0x43. 0x43 ("C") - 0x40 = 0x03, ETX. Jeff Zeitlin 6 лет назад 1

1 ответ на вопрос

5
LPChip

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

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

«Копировать» значение « CtrlCпроисходит от 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 цепочки ключей, или заставить его ничего не отправлять и вместо этого выполнять операцию копирования. Вы также выбрать другой keychord послать Ctrl+ C(если у вас есть не-ноутбук клавиатура компьютера, вы можете использовать вне пути- Pause/ Break ключ). Не все терминалы могут быть настроены таким образом.

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

Хороший ответ, хорошо продуманный, и гораздо больше, чем я когда-либо хотел знать. ;-) computercarguy 6 лет назад 0
Потрясающий ответ, особенно в сочетании с комментарием Джеффа. Спасибо! jhpratt 6 лет назад 0