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

Sep 23 2020

Во время работы apt upgradeя случайно отправил Ctrl- Sв это окно терминала.

Теперь я знаю XOFF, XON, Ctrl- Qи что - то новое о телетайпе.

Когда я отправил Ctrl- Qна "приостановленный" терминал aptпродолжил свою работу.

Читая о XOFF, мне непонятно, что произошло aptили что вообще происходит в любой команде, которая получает файл XOFF. htopперестает обновлять дисплей, что полезно знать, но htopвсе еще работает?

Все aptеще работает? Или aptи htopэффективно остановился, замерев?

По-видимому, процессы все еще могут получать ввод, пока XOFF'd, поэтому они все еще выполняются.

Что происходит? Например, счетчик программ, по-видимому, не просто перестает увеличивать счетчик программ, замораживая программу.

Зависит ли это от того, как запрограммирована команда для обработки XOFF? Можно ли ожидать общего поведения от основных команд Linux?

Ответы

1 user414777 Sep 23 2020 at 21:01

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. Все это обрабатывается внутри драйвера терминала. С точки зрения приложения ничего не происходит. Если программа продолжает отправлять обильный вывод (или параметр ECHOtermios включен - по умолчанию - и он продолжает получать обильный ввод), любая запись (или соответствующее чтение) в терминал в какой-то момент будет блокироваться до тех пор, пока не будет получен Ctrl-Q.

1 AdminBee Sep 23 2020 at 19:17

Как вы, возможно, уже знаете, XONи XOFF, привязанные к Ctrl+ Sи Ctrl+ Qпо умолчанию, являются символами программного управления потоком и в принципе являются пережитками старых времен бумажных телетайпов . Они использовались в тех случаях, когда принимающее оборудование (часто бумажный принтер) иногда не справлялось с вводом, отправленным удаленным отправителем.

В настоящее время бумажные телетайпы больше не используются, но идея, лежащая в основе них, все еще сохраняется в программной структуре «терминала» (см., Например, здесь и эту очень хорошую статью по истории TTY ), который унаследовал и до сих пор реализует некоторые из концепции, использованные в оригинальных бумажных терминалах, одна из которых - способность интерпретировать символы управления потоком.

Как правило, программа работает «на консоли», т.е. соединен с псевдо-терминал, не получает , чтобы увидеть XONи XOFFсимволы , как они по умолчанию пойманного терминала, где стандартное поведение XOFFявляется остановить печать вывода его получает от программы. В остальном сама программа не подвержена влиянию и продолжает работать в фоновом режиме, только вывод не «отправляется вперед» пользователю, пока не XONбудет получен снова.

Если вы пишете программу и хотите явно получать эти входные символы, вы можете использовать tcsetattr()системный вызов в своей программе, чтобы отключить управление потоком программного обеспечения с помощью IXOFFфлага (см. Здесь, например ) - nanoделает это , например.