9

私は現在、chat clientと正常に通信するを持っていa serverます。別のチャットメッセージを受信したときにプロンプ​​トが下に移動するように動作を変更することになっています(つまり、メッセージを印刷\bしてプロンプトを消去し、メッセージを印刷してから、プロンプトを再印刷することで、メッセージがプロンプトの「上」に印刷されます)。

test clientこの機能をテストするためのとが与えられましたtest server。現在、ユーザーにプロンプ​​トが表示されても何も入力されていない場合、他のユーザーからメッセージを受信できます。入力を開始すると、メッセージ全体を入力してEnterキーを押すまで、バッファはフラッシュされません。

私はこの振る舞いを再現することになっていますが、rawモードが実際に何であるかについて非常に混乱しています。

誰かがrawモードを介して入出力を制御する方法を教えてもらえますか、または上記のテストプログラムの動作がrawモードを使用することで発生する理由を教えてください。

4

2 に答える 2

18

デフォルトでは、Unixスタイルのtty(つまりコンソール)ドライバーは「調理済みモード」で入力を受け取ります。このモードでは、ある程度のコマンドライン編集が可能です。ユーザーは入力行を入力でき、その一部を削除して再入力することもできます(ただし、常に機能するとは限りません)。ユーザーがEnterキーを押すまで、プログラムは入力を表示しません。

これはおそらく、シリアル回線を介してコンピュータに接続されたハードウェア端末の時代を思い起こさせます。端末が低レベルの編集の一部を処理する場合、コンピューターはそれを行う必要はありません。また、簡単なCプログラムに基本的な入力編集を無料で提供します。

対照的に、rawモードは、入力時にすべての文字をプログラムに渡すようにTTYドライバーを設定します。プログラム(Unixishオペレーティングシステム上)は、デフォルトでクックモードで起動され、rawモードを有効にする必要があります。

これを行う方法は、オペレーティングシステム間で大きく異なりますが、POSIXは最近この機能を標準化しています。Linuxでは、ドキュメントの「termios」および「tty_ioctl」のマニュアルページを読むことができます。基本的に、tty設定を含むデータ構造を取得し、関心のある部分を変更して(具体的には、rawモードを有効にして)、それを返します。

もう1つの可能性は、ncursesライブラリを使用することです。それはあなたのためにそのすべてのものを抽象化します。

于 2012-10-27T22:05:02.470 に答える
6

rawモードでは、文字はプログラムに直接渡されます。たとえば、クックモードで端末を入力すると、入力した文字が即座に画面にエコーされます。rawモードでは、文字は端末によって無視され(つまり、エコーされません)、プログラムにはそれをエコーするかどうかのオプションがあります。

編集:ウィキペディアには、調理済みモードに関する優れた記事があります。http://en.wikipedia.com/wiki/Cooked_Mode また、rawモードでは、同様の文字がプログラムに直接渡されることに注意してください。

于 2012-10-27T22:04:26.220 に答える