Влияние 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?
Ответы
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.
Как вы, возможно, уже знаете, XONи XOFF, привязанные к Ctrl+ Sи Ctrl+ Qпо умолчанию, являются символами программного управления потоком и в принципе являются пережитками старых времен бумажных телетайпов . Они использовались в тех случаях, когда принимающее оборудование (часто бумажный принтер) иногда не справлялось с вводом, отправленным удаленным отправителем.
В настоящее время бумажные телетайпы больше не используются, но идея, лежащая в основе них, все еще сохраняется в программной структуре «терминала» (см., Например, здесь и эту очень хорошую статью по истории TTY ), который унаследовал и до сих пор реализует некоторые из концепции, использованные в оригинальных бумажных терминалах, одна из которых - способность интерпретировать символы управления потоком.
Как правило, программа работает «на консоли», т.е. соединен с псевдо-терминал, не получает , чтобы увидеть XONи XOFFсимволы , как они по умолчанию пойманного терминала, где стандартное поведение XOFFявляется остановить печать вывода его получает от программы. В остальном сама программа не подвержена влиянию и продолжает работать в фоновом режиме, только вывод не «отправляется вперед» пользователю, пока не XONбудет получен снова.
Если вы пишете программу и хотите явно получать эти входные символы, вы можете использовать tcsetattr()системный вызов в своей программе, чтобы отключить управление потоком программного обеспечения с помощью IXOFFфлага (см. Здесь, например ) - nanoделает это , например.