
Во время работы apt upgrade
я случайно отправил символ Ctrl«-» Sв окно терминала.
Теперь я знаю о XOFF
, XON
, Ctrl- Qи кое-что новое о телетайпе.
Когда я отправил Ctrl- Qна «приостановленный» терминал, apt
он продолжил свою работу.
Из прочтения о XOFF
мне непонятно, что произошло в apt
, или что вообще происходит в любой команде, которая получает XOFF
. htop
останавливает обновление дисплея, что полезно знать, но htop
все еще выполняется?
Все apt
еще работает? Или был apt
и htop
фактически приостановлен, заморожен?
По-видимому, процессы все еще могут получать входные данные, пока они находятся в состоянии XOFF
'd, поэтому они все еще выполняются.
Что происходит? Например, счетчик программ, судя по всему, он просто не прекращает увеличивать счетчик программ, замораживая программу.
Зависит ли это от того, как команда запрограммирована для обработки XOFF? Есть ли общее поведение, которого можно ожидать от основных команд Linux?
Примечаниечтоэтоти подобные вопросы не содержат ответов на мой вопрос, поскольку они не упоминают, что происходит в самой программе. Например, я не знаю, apt
продолжала ли она работать в тишине или была заморожена/приостановлена.
решение1
Как вы уже знаете, XON
и XOFF
, привязанные к Ctrl+ Sи Ctrl+ Qпо умолчанию, являютсяуправление потоком программного обеспеченияперсонажи и в принципе реликвии изстарые времена бумажно-печатающих телетайпных терминалов. Они использовались в тех случаях, когда принимающее оборудование (часто принтер для печати на бумаге) не успевало обрабатывать входные данные, отправленные удаленным отправителем.
В настоящее время бумажные телетайпы больше не используются, но идея, лежащая в их основе, по-прежнему сохраняется в программной структуре «терминала» (см., например,здесьиэта очень хорошая статья об истории телетайпа), который унаследовал и до сих пор реализует некоторые концепции, использовавшиеся в оригинальных бумажных терминалах, одной из которых является возможность интерпретации символов управления потоком.
Обычно программа, работающая "на консоли", т. е. подключенная к псевдотерминалу, не видит символы XON
и XOFF
, поскольку они по умолчанию перехватываются терминалом, где стандартным поведением является XOFF
прекращение печати вывода, который она получает от программы. Сама программа в остальном не затронута и продолжает работать в фоновом режиме, только вывод не "отправляется" пользователю, пока XON
снова не будет получен .
Если вы пишете программу и хотите явно получать эти входные символы, вы можете использовать системный tcsetattr()
вызов в своей программе, чтобы отключить программное управление потоком с помощью IXOFF
флага (см.здесь, например) -nano
делает это, например.
решение2
htop
прекращает обновление дисплея, что полезно знать, ноhtop
все еще работает [после нажатия Ctrl-S]?
Да, безусловно. htop
или другая команда НЕ останавливается и не замораживается сочетанием клавиш Ctrl-S.
Настройка IXON
termios не работает как ISIG
. Ввод символов VSTOP
(Ctrl-S) или VSTART
(Ctrl-Q) НЕ отправляет никаких сигналов процессу, запущенному в терминале.
Это очень легко проверить; откройте два терминала: в первом введите
tail -f /tmp/file
и во втором
cat > /tmp/file
Теперь во втором терминале нажмите Ctrl-S, затем продолжайте слепо печатать строки, а затем нажмите Enter. Они появятся на экране в первом терминале. Если вместо cat
этого будет оболочка и это будут команды типа rm ...
, они будут выполнены без необходимости вывода на экран.
что обычно происходит в любой команде, которая получает XOFF.
Команда не «получает XOFF». Все это обрабатывается внутри драйвера терминала. С точки зрения приложения ничего не происходит. Если программа продолжает отправлять обильный вывод (или ECHO
включена настройка termios --по умолчанию-- и она продолжает получать обильный ввод), любая запись (или соответствующее чтение) на терминал в какой-то момент будет заблокирована, пока не будет получено Ctrl-Q.