Влияние Ctrl-S / XOFF на процесс

Влияние Ctrl-S / XOFF на процесс

Во время работы 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.

Настройка IXONtermios не работает как 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.

Связанный контент