端末で改行文字を自動的に翻訳します。

端末で改行文字を自動的に翻訳します。

フォローするここ

私はこの時点で次の事実を見つけました(完全ではなく、単にデモ用です)。

#include <termios.h>

  raw.c_iflag &= ~(ICRNL | IXON);
  raw.c_oflag &= ~(OPOST);
  raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);

次のようにしてください。

printf("\n");

カーソルを最初に移動せずに次の行に進みます。テキストでは、一般\n的に翻訳され無効になっていると\r\n説明しますOPOST

このICNRLフラグを使用すると、^M端末はキャリッジリターン(通過)を正しく受信できます。

マニュアルはインスピレーションを与えません:

OPOSTは実装定義の出力処理を可能にします。

誰かが歴史とここで何が起こっているのかをより詳細に説明できますか?

それでは、ファイルの16進ダンプをインポートするときにどのように\nシングルバイトにすることができますか? 「自動翻訳」は\r\n実際にテキストのバイトを対象とするのではなく、純粋にビューに基づいて行われますか?

答え1

この質問に対する詳細な回答はチュートリアルで確認できます。すべての出力処理をオフにする

端子は出力側でも同様の変換を行うことがわかった。これは、私たちが印刷するすべての改行文字(「\ n」)を改行文字(「\ r \ n」)が続くキャリッジリターン文字に変換します。端末で新しいテキスト行を開始するには、これら2文字が必要です。キャリッジリターン文字はカーソルを現在の行の先頭に戻し、改行文字はカーソルを1行下に移動し、必要に応じて画面をスクロールします。 (これら2つの異なる仕事はタイプライターとテレタイプのライターの時代に由来しました。)

あなたの質問に直接答えるには、

それでは、ファイルの16進ダンプを実行するときに\ nがシングルバイトであるのはなぜですか? \ r \ nの「自動翻訳」は実際にはテキストのバイトを対象とするのではなく、ビューベースでのみ行われますか?

はい。端末に送信されると、各インスタンスは\n端末回線規則に従って変換されます。\r\nこのフラグを使用して後処理をオフにできますopost。シェルレベルでは、次の方法で管理できます。stty

stty -opost    # Turn off "opost" processing
ls             # Notice you get a ladder effect due to there being no CR actions
stty opost     # Restore "opost" processing

試してみる場合は、stty現在の状態を保存して後で復元できることに注意してください。

g=$(stty -g)    # Save current state
stty raw        # Interesting times ahead
stty $g         # Follow this with « Ctrl j » rather than « Enter »

これはbashコマンドライン編集(GNU)を提供するので、期待どおりに機能しませんreadline。他のシェル(例:(dash))に入れると、sh実際の効果を見ることができます。

関連情報