Почему из редактора нельзя выйти с C-c?

32-разрядный CD GParted может изменить размер разделов с 64-разрядным OS'es на них, без проблем.

20
17.08.2014, 03:25
3 ответа

Это обозначения для традиционных серверных шрифтов X11. Формат имени называется X логическое описание шрифта (XLFD). Вводное описание приведено на X странице .

XLFD содержит 14 поля, каждое из которых имеет префикс тире. Положение поля определяет его значение: литейное производство, семья, вес и т. д. Поле может содержать значение * , позволяющее серверу выбрать любое. Например:

  • - * -fixed- * - * - * * -100- * - * - * - * - * - * - * означает любой шрифт, семья имя которого является фиксированным и размер пикселя которого (высота в виде количества пикселей на экране) равен 100 (что является огромным).
  • - * -fixed- * * - * - * - * -100- * * - * - * - * - * * означает любой шрифт, семья имя которого является фиксированным и размер точки которого (высота в единицах 0,1 точек, где точки определяются разрешением в следующих двух полях) равен 100 точкам (что является крошечным).
  • - * -fixed- * - * * -100- * * - * - * - * - * - * * не соответствует ни одному шрифту, поскольку он задает стиль (который подобен sans или сжатый - обычно пустой) равным 100 . При отсутствии полей последние * соответствуют нескольким полям.

Можно запустить xfontsel для просмотра доступных шрифтов в системе. Для растровых шрифтов xfontsel перечисляет все доступные размеры. Для векторных шрифтов можно выбрать любой размер.

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

-121--167249-

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

С точки зрения пользователя оба варианта очень похожи. Обработка сигнала различна: в обычном случае сигнал SIGINT посылается в основной процесс, выполняется команда, и команда обрабатывает его выходом.
В случае ed сигнал передается в основной процесс, экземпляр ed . Если задача выполняется в ed , она прерывается и отображается подсказка. Если задача не выполняется, ничего не изменяется.

Обратите внимание, что оболочка также не выходит из Ctrl + C , как и ed . И выйти на Ctrl + D . Опять же, подобно ed

-121--22049-

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

Так что естественно, что Ctrl + C не убивает, а заставляет его вернуться к своему контуру верхнего уровня. Ctrl + C прерывает текущую входную строку и возвращается в запрос ed.

То же самое касается меньшего количества команд: Ctrl + C прерывает текущую команду и возвращает ее в командную строку.

По историческим причинам eded игнорирует SIGQUIT ( Ctrl + \). Обычные приложения не должны улавливать этот сигнал и позволять завершать работу при включенном дампе ядра.

20
27.01.2020, 19:43

Исходный код Unix V7 ed(1) - это примитивная 1,762-строчная программа на Си с всего лишь несколькими комментариями, один из которых - этот весьма просветляющий заголовочный комментарий:

/*
 * Editor
 */

Учитывая, что сам по себе исходный код не дает никакого обоснования, вы получите его только от автора программы.

ed изначально был написан Кеном Томпсоном в сборке PDP-11, но на самом деле вам нужно было бы поговорить с тем, кто портировал его на C. Это мог быть Деннис Ричи , с тех пор, как он создал C для Unix, и был одним из многих, кто использовал C, чтобы сделать Unix портативным для машин, не использующих PDP. Доктора Ричи больше нет рядом, чтобы ответить на такие вопросы.

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

Вот что делает ed на Ctrl-C:

onintr()
{
    signal(SIGINT, onintr);
    putchr('\n');
    lastc = '\n';
    error(Q);
}

(Да, K&R C. Нам не нужны ни спецификаторы типа возврата, ни объявления параметров.)

Переведено на английский язык, ed:

  1. Перерегистрируйте обработчик сигнала.

    (Unix не получал сигналов автосброса до 4.3BSD, в середине 80-х.)

  2. Записывает новую строку и запоминает, что это было сделано, через глобальную переменную lastc.

    (ed.c имеет около 60 глобальных переменных.)

  3. вызывает функцию error(), которая famously, с точки зрения пользователя, делает немногим больше, чем выводит ?.

Другими словами, она говорит: "Ты ведь не хотел этого делать?"

.
18
27.01.2020, 19:43

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

С точки зрения пользователя оба варианта очень похожи. Обработка сигнала отличается: в обычном случае сигнал SIGINT посылается на передний план, выполняется команда, и команда обрабатывает его, выходя.
В случае ed сигнал посылается на передний план, экземпляр ed. Если в ed выполняется задача, то она прерывается, и отображается запрос. Если задача не выполняется, то ничего не изменяется.

Обратите внимание, что оболочка также не выходит на Ctrl+C, как и ed. И что он выходит на Ctrl+D. Опять же, как ed

7
27.01.2020, 19:43

Теги

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