web-dev-qa-db-ja.com

端末で誤ってCtrl-Sを押した後にフリーズを解除する方法は?

それは私に頻繁に起こった状況です:私が押した後(別の意図で) Ctrl-S 端末では、それとの相互作用(入力または出力)が凍結されます。それはおそらく「スクロールロック」のようなものでしょう。

この後、ターミナルをフリーズ解除するにはどうすればよいですか?

(今回は、apt-Shellbashurxvt内----の特別な処理を担当しているのは不明 Ctrl-S:コマンドの履歴を逆に検索していた C-r、通常のreadlineと同じですが、少なくともEmacsでは、通常の方法で履歴を「戻って」進みたいと思っていました。C-s ( 12 、)ですが、端末がフリーズしました。まあ、過去のものを見るためにスクロール/ページングは​​まだターミナルで機能しますが、そこで実行されているプロセスとの相互作用はありません。

Ctrl-Q

これを完全に無効にするには、スタートアップスクリプトにstty -ixonを貼り付けます。任意のキーで物事が再び流れるようにするには、stty ixanyを使用します。

ps:これを行うのは端末でもシェルでもありませんが、OSの端末ドライバーです。

924
ak2

Ctrl-Q 確かに答えです。 ak2の正解 のマージンに合わせるには長すぎる、これの少しの履歴を投げると思いました。

暗黒時代には、端末はリモートデバイス(テレタイプは電信キーよりも操作がはるかに簡単だったため、元々は別の端末でした)に長いワイヤーまたはモデム付きの電話回線を介して接続された大きな機器でした。 Unixが開発されるまでに、ASCIIコードはすでに確立されていました(ただし、IBMからの競合するEBCDICコードは依然として考慮すべき勢力でしたが)。

初期の端末は、受け取ったすべての文字の印刷された記録を保持していました。少なくとも、プリントヘッドがタイプできるよりも速く文字が到着しない限り。しかし、CRTベースの端末が可能になるとすぐに、CRTに適合するのは約25行だけであり、80文字の25行で十分であるという問題が発生しましたRAM追加の提供を真剣に考えていなかった= RAM画面の上部からスクロールされた文字の場合。

したがって、リーダーが追いつくように送信側が一時停止する必要があることを通知するために、いくつかの規則が必要でした。

7ビットASCIIコードには、制御文字(0〜31および127)専用の33個のコードポイントがあります。NUL(空白など)スレッディング、ギャップ、スプライス用の紙テープリーダー)、DEL(7つの穴すべてをパンチすることで示される紙テープの「取り消し線」文字)、BEL(丁!)、CRLF、およびTAB。ただし、4つは端末デバイス自体を制御するために明示的に定義されました(DC1DC4別名Ctrl + Q、Ctrl + R、Ctrl + SおよびCtrl + T)。

私の推測では、あるエンジニアは(ニーモニックとして)、「停止」の「S」と「続行」の「Q」はそれほど悪くないと考えて、DC3「送信を停止してください」を意味し、DC1「OK、今すぐ送信を続ける」を意味します。

Unixが世界に出かけるためにベル研究所に巣を作る頃には、その慣習さえもすでに確立されていました。

この規則はソフトウェアフロー制御と呼ばれ、実際のシリアルデバイスでは非常に一般的です。正しく実装するのは簡単ではありません。通信チャネルで他の目的でこれらの文字のいずれかを使用できなくなり、受信側が送信できる以上の送信を回避するために、保留中の受信文字の前に停止信号を処理する必要があります。扱う。

実用的な場合は、シリアルデータストリームからの帯域外の追加信号をフロー制御に使用することをお勧めします。追加の信号線を利用できる直接有線接続では、ハードウェアハンドシェイクが使用されているため、これらの文字が他の用途に解放されます。

もちろん、今日のターミナルウィンドウは実際の物理シリアルポートを使用しておらず、スクロールバーがあり、ソフトウェアのハンドシェイクはまったく必要ありません。しかし、慣習は存続します。

Richard Stallmanが、emacsの最初のリリースでインクリメンタル検索へのCtrl + Sのマッピングについて苦情を受け取り、7ビットのソフトウェアフロー制御接続に依存する必要のあるユーザーにはあまり同情しなかったという主張を思い出します。

412
RBerteig