LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Надо разделять три сущности:

  1. гуи-эмулятор терминала (xterm, gnome-terminal итд) - это программа, которая шлёт в консоль (со своей стороны) все нажатые кнопки, и рисует на экране то что с консоли приходит. Комбинацию Ctrl+C и остальные он шлёт так же как и всё остальное, никаких специальных обрабоок не делает.

  2. ядерный драйвер консоли (не знаю как он там называется) - в данном контексте представлен двумя открытыми «файловыми» потоками: один подсоединён к эмулятору терминала, второй - (обычно) к stdin/stdout/stderr запущеной в терминале проги; в первом приближении можно считать это просто двум концами локального коннекта, но есть отличия: например, если эмулятор прислал ctrl+c, драйвер не шлёт его проге как нажатую кнопку, а вместо этого шлёт SIGINT.

  3. сама прога, bash это или что-то ещё - значения не имеет - все они могут переназначить SIGINT на другое Ctrl+hotkey (тогда Ctrl+C будет слаться как нажатый символ), вообще убрать hotkey или сделать нестандартный обработчик к SIGINT - для всего этого не требуется никаких спец. прав.

bash тут отличается только тем, что SIGINT он игнорирует, а при запуске дочерних прог - снимает (для них) игнор

Так что никакой юзерспейс за это не отвечает, отвечает именно ядро (п.2). Ну, ты можешь конечно в эмуляторе терминала (п.1) сделать костыль, который сам будет перехватывать Ctrl+C, не слать его ядру и делать что-то своё. Делать это надо будет в коде x11-приложения, никаких readline и прочих консольных библиотек там разумеется нет. Делать что-то в п.3 бесполезно, запущеная прога сама там всем управляет, твои костыли просто некуда сувать.

Исправление firkax, :

Надо разделять три сущности:

  1. гуи-эмулятор терминала (xterm, gnome-terminal итд) - это программа, которая шлёт в консоль (со своей стороны) все нажатые кнопки, и рисует на экране то что с консоли приходит. Комбинацию Ctrl+C и остальные он шлёт так же как и всё остальное, никаких специальных обрабоок не делает.

  2. ядерный драйвер консоли (не знаю как он там называется) - в данном контексте представлен двумя открытыми «файловыми» потоками: один подсоединён к эмулятору терминала, второй - (обычно) к stdin/stdout/stderr запущеной в терминале проги; в первом приближении можно считать это просто двум концами локального коннекта, но есть отличия: например, если эмулятор прислал ctrl+c, драйвер не шлёт его проге как нажатую кнопку, а вместо этого шлёт SIGINT.

  3. сама прога, bash это или что-то ещё - значения не имеет - все они могут переназначить SIGINT на другое Ctrl+hotkey (тогда Ctrl+C будет слаться как нажатый символ), вообще убрать hotkey или сделать нестандартный обработчик к SIGINT - для всего этого не требуется никаких спец. прав.

bash тут отличается только тем, что SIGINT он игнорирует, а при запуске дочерних прог - снимает (для них) игнор

Так что никакой юзерспейс за это не отвечает, отвечает именно ядро. Ну, ты можешь конечно в эмуляторе терминала сделать костыль, который сам будет перехватывать Ctrl+C, не слать его ядру и делать что-то своё. Делать это надо будет в коде x11-приложения, никаких readline и прочих консольных библиотек там разумеется нет.

Исходная версия firkax, :

Надо разделять три сущности:

  1. гуи-эмулятор терминала (xterm, gnome-terminal итд) - это программа, которая шлёт в консоль (со своей стороны) все нажатые кнопки, и рисует на экране то что с консоли приходит. Комбинацию Ctrl+C и остальные он шлёт так же как и всё остальное, никаких специальных обрабоок не делает.

  2. ядерный драйвер консоли (не знаю как он там называется) - в данном контексте представлен двумя открытыми «файловыми» потоками: один подсоединён к эмулятору терминала, второй - (обычно) к stdin/stdout/stderr запущеной в терминале проги; в первом приближении можно считать это просто двум концами локального коннекта, но есть отличия: например, если эмулятор прислал ctrl+c, драйвер не шлёт его проге как нажатую кнопку, а вместо этого шлёт SIGINT.

  3. сама прога, bash это или что-то ещё - значения не имеет - все они могут переназначить SIGINT на другое Ctrl+hotkey (тогда Ctrl+C будет слаться как нажатый символ), вообще убрать hotkey или сделать нестандартный обработчик к SIGINT - для всего этого не требуется никаких спец. прав.

bash тут отличается только тем, что SIGINT он игнорирует, а при запуске дочерних прог - снимает (для них) игнор