
當我運行時,apt upgrade
我不小心向該終端視窗發送了一個Ctrl- 。S
現在我知道了XOFF
,,XON
- ,以及一些關於電傳打字機的新東西Ctrl。Q
當我向“暫停”終端發送一個Ctrl-時,繼續其工作。Qapt
透過閱讀XOFF
,我不清楚apt
在接收到 的任何命令中發生了什麼,或者通常會發生什麼XOFF
。htop
停止更新顯示,這是一件好事,但仍在htop
運行?
還在apt
跑嗎?還是實際上被apt
暫停htop
、凍結了?
顯然,進程仍然可以接收輸入,而XOFF
'd,因此它們仍在執行。
怎麼了?例如,程式計數器,顯然它並不是簡單地停止增加程式計數器、凍結程式。
它是否取決於命令如何編程來處理 XOFF?基本 Linux 指令是否存在可以預期的一般行為?
筆記那這類似的問題不包含我的問題的答案,因為它們沒有提到程式本身發生的情況。例如,我不知道是否apt
繼續默默運行,或者是否被凍結/暫停。
答案1
您可能已經知道,XON
和XOFF
,預設情況下綁定到Ctrl+S和Ctrl+ Q,是軟體流量控制人物和原則上的遺物紙質印刷電傳終端的舊時代。當接收裝置(通常是紙本印表機)有時無法跟上遠端發送器發送的輸入時,就會使用它們。
如今,紙質電傳打字機已不再使用,但背後的想法仍保留在「終端」的軟體框架中(參見例如這裡和這篇關於 TTY 歷史的非常好的文章),它繼承並仍然實現了原始紙質終端中使用的一些概念 - 其中之一是解釋流量控製字元的能力。
通常,「在控制台上」運行的程式(即連接到偽終端)不會看到XON
和XOFF
字符,因為它們默認由終端捕獲,其中標準行為XOFF
是停止列印輸出從程式接收。程式本身不受影響,並繼續在後台運行,只是輸出不會「轉發」給用戶,直到XON
再次收到。
如果您編寫程式並希望明確接收這些輸入字符,則可以tcsetattr()
在程式中使用系統呼叫透過標誌停用軟體流控制IXOFF
(請參閱在這裡,例如)--nano
這樣做, 例如。
答案2
htop
停止更新顯示,這是值得知道的事情,但htop
仍在運行[輸入 Ctrl-S 後]?
是的,一點沒錯。htop
或其他指令不會被 Ctrl-S 停止或凍結。
termiosIXON
設定不像ISIG
.鍵入VSTOP
(Ctrl-S) 或VSTART
(Ctrl-Q) 字元不會向終端機中執行的程序發送任何訊號。
檢查起來很容易;打開兩個終端:在第一個輸入
tail -f /tmp/file
在第二個
cat > /tmp/file
現在,在第二個終端機中鍵入 Ctrl-S,然後繼續盲目地鍵入行,然後按 Enter。它們將出現在第一個終端的螢幕上。如果不是cat
shell 並且這些命令是類似 的命令rm ...
,那麼它們將運行而無需在螢幕上回顯。
在接收到 XOFF 的任何命令中通常會發生什麼。
該命令不“接收 XOFF”。這一切都在終端驅動程式內部處理。從應用程式的角度來看,什麼也沒有發生。如果程式不斷發送大量輸出(或ECHO
termios 設定處於預設狀態,並且它不斷接收大量輸入),則任何對終端的寫入(或相應的讀取)都會在某個時刻被阻止,直到收到Ctrl-Q 。