Terminal

在終端中意外按下 Ctrl-S 後 如何解凍?

  • October 22, 2021

這是我經常發生的情況:在我(以不同的意圖)Ctrl-S在終端中按下後,與它的互動(輸入或輸出)被凍結。它可能是一種“滾動鎖”或其他什麼。

在此之後如何解凍終端?

(這一次,我一直在insideapt-shell工作——不確定他們中的哪一個負責對 的特殊處理:我像往常一樣使用 readline 向後搜尋命令的歷史記錄,但後來我想“返回” " 以通常的方式轉發歷史記錄——至少在 Emacs 中—— ( 1 , 2 , 3 ),但這會導致終端凍結。好吧,滾動/分頁查看過去的東西仍然可以在終端中使用,但沒有互動程序在那裡執行。)bash``urxvt``Ctrl-S``C-r``C-s

Ctrl-Q

要完全禁用它,請堅持stty -ixon啟動腳本。要允許任何鍵讓事情再次流動,請使用stty ixany.

ps:這既不是終端也不是shell,而是作業系統的終端驅動程序。

Ctrl——Q確實是答案。我想我會拋出一個太長的歷史,不適合ak2 正確答案的空白。

回到黑暗時代,終端是一個大型設備,通過一根長電線或帶有調製解調器的電話線連接到遠端設備(最初是另一個終端,因為電傳打字機比電報鍵更容易學習操作)。到 Unix 開發的時候,ASCII 程式碼已經很成熟了(儘管來自 IBM 的競爭 EBCDIC 程式碼仍然是一股不可忽視的力量)。

最早的終端保留了接收到的每個字元的列印記錄。至少,只要字元到達的速度不超過列印頭的打字速度。但是一旦基於 CRT 的終端成為可能,問題就出現了,CRT 上只有大約 25 行,而 25 行 80 個字元代表了足夠的 RAM,沒有人認真考慮為滾動離開頂部的字元提供更多 RAM螢幕。

所以需要一些約定來表示發送端應該暫停以讓讀者趕上。

7 位 ASCII 程式碼有 33 個程式碼點專用於控製字元(0 到 31 和 127)。其中一些具有非常明確的用途,例如NUL(用於穿線、間隙和接頭的空白紙帶引線),DEL(通過打孔所有七個孔表示紙帶上的“劃掉”字元),BEL(叮!)CR,,,,LFTAB. 但是明確定義了四個用於控制終端設備本身(DC1DC4稱為 Ctrl+Q、Ctrl+R、Ctrl+S 和 Ctrl+T)。

我最好的猜測是,一些工程師認為(就像助記符一樣),“S”代表“停止”,“Q”代表“繼續”並不算太糟糕,並被指定DC3為“請停止發送”和DC1“好的” ,現在繼續發送”。

甚至在 Unix 離開貝爾實驗室走向世界時,這種約定也已經很成熟了。

該約定稱為軟體流控制,在實際串列設備中極為常見。正確實現並不容易,因為它會阻止將這些字元中的任何一個用於通信通道中的任何其他目的,並且必須在任何未決接收字元之前處理停止信號,以避免發送超過接收端可以發送的字元處理。

如果可行,最好使用來自串列數據流的帶外附加信號進行流量控制。在可以負擔額外信號線的直接有線連接上,您會發現正在使用硬體握手,這可以釋放這些字元以供其他用途。

當然,今天的終端視窗沒有使用實際的物理串列埠,有捲動條,根本不需要軟體握手。但公約仍然存在。

我記得 Richard Stallman 在 emacs 的第一個版本中收到了關於他將 Ctrl+S 映射到增量搜尋的投訴,並且他對任何必須依賴 7 位軟體流控制連接的使用者都相當冷漠。

引用自:https://unix.stackexchange.com/questions/12107