2016-06-25 8 views
1

私はbeejからselect()を使ってプログラムを理解しようとしています。なぜユーザーからの入力が端末にエコーされていますか?

キーを押すと、プログラムは「キーが押されました」と表示します。しかし、プログラムが終了すると、同じキーが端末にエコーされ、「コマンドが見つかりません」というエラーが表示されます。なぜ押されたキーが端末にエコーされているのですか?

ソースコード:

/* 
* select.c demo 
*/ 

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <unistd.h> 

#define STDIN 0 

int main(int argc, char *argv[]){ 
    struct timeval tv; 
    fd_set readfds; 

    tv = (struct timeval){0}; 
    tv.tv_sec = 2; 
    tv.tv_usec = 5000000; 

    FD_ZERO(&readfds); 
    FD_SET(STDIN, &readfds); 

    select(STDIN + 1, &readfds, NULL, NULL, &tv); 

    if (FD_ISSET(STDIN, &readfds)){ 
     printf("A key was pressed\n"); 
    } 
    else{ 
     printf("Timed Out!\n"); 
    } 

    return 0; 
} 

出力:

[email protected]:Socket_Programming$ 
[email protected]:Socket_Programming$ ./select 
f 
A key was pressed 
[email protected]:Socket_Programming$ f 
f: command not found 
+1

右ここにテキストとして、コードだけでなく、出力を貼り付けてください。 –

+2

さて、 "キー"を 'read() 'しておらず、入力可能性しか検出していません。 「キー」は入力バッファに残ります。 –

+0

シェルに行ってみよう – PSkocik

答えて

1

あなたのプログラムがそのstdinから何かを消費しません。 stdinからの読み取りが割り当てられた時間内に成功するかどうかだけをチェックします。 は結果的に、入力消費の期間で、それはのように振る舞う:

$ sleep 2.5 

あなたはそれを実行し、タイプf<enter>場合は、デフォルトの端末設定(sttyで制御)でそれはエコーされます(端末が正常に入力したすべてのものをエコー、これをオフにしない限り、例えばパスワード入力のため)、sleepがあなたのシェルがそれを受け取った時点で終了すると、再度呼び出されます。シェルはシェルが何をするかを実行します。これは失敗し、command not foundというエラーメッセージが表示されます。

0

つまり、あなたのプログラムの端末から何も読んだことはありませんでした。読書の準備ができているだけです。以下の詳細な説明。

詳細

あなたのプログラムからの出力が端末(などkonsoleのか、xtermのような)プログラムとどのように押されたキーがあなたのプログラムに来ることになるか、メイン疑問。短い言葉で

2つのがあり、結合したデバイスがある:

  1. 端子マスタ - このデバイスは、プログラム
  2. 末端スレーブの実行結果を表示する端末プログラムによって使用される - このデバイスは、のようないくつかのプログラムによって使用されるがbash。

stdinは、端末スレーブデバイスにバインドされたプログラム内のファイル記述子です。

は、このシンボルは、端末マスタデバイスに書き込まれ
  • 、端末マスタデバイスがにシンボルを渡す:あなたはターミナルプログラムでキーを押すと

    (私はtermiosのように、端末のマスター特定の事柄に関連するいくつかの手順をスキップ)

  • リード状態の準備ができてSTDINファイル記述子への端末のスレーブデバイス
  • 、端末スレーブデバイスのスイッチが
  • 「読み込みの準備ができて、」選択終了に状態を変更しますあなたのプログラムは "キーが押された"と書いています
  • あなたのプログラムは終了しました(デバイスから何も読みません)
  • シェルプログラムのbeginは端末スレーブから読み込みます。 F」と
  • シェルプログラムを入力するには、F解釈し、起動プログラムとして入力して 『F』
関連する問題