)C

2012-04-18 4 views
3

に、私は次のプログラムがあります)C

#include <stdio.h> 
#define STDIN 0 

int main() 
{ 

    fd_set fds; 
    int maxfd; 
    // sd is a UDP socket 

    maxfd = (sd > STDIN)?sd:STDIN; 

    while(1){ 

     FD_ZERO(&fds); 
     FD_SET(sd, &fds); 
     FD_SET(STDIN, &fds); 

     select(maxfd+1, &fds, NULL, NULL, NULL); 

     if (FD_ISSET(STDIN, &fds)){ 
       printf("\nUser input - stdin"); 
     } 
     if (FD_ISSET(sd, &fds)){ 
       // socket code 
     } 
    } 
} 

を私が直面する問題は、入力はSTDIN上で検出されると、メッセージ「ユーザー入力 - 標準入力が」ということである印刷を続けています。.. .whyは、ディスクリプタのどれが入力を持っているかをループチェックしている間に、一度だけ印刷し、次に印刷しませんか?

ありがとうございました。

答えて

8

select機能は、利用可能な入力がある場合にのみ通知します。実際にそれを消費しない場合、選択はまっすぐ落ち続けるでしょう。

3

あなたはSTDINを読んでいないので、次回はループの周りにまだ読んでいるものがあります。

これを防ぐには、STDINを読む必要があります。

+0

私は実行中のプログラムを持っていて、コンソールにテキストを入力してEnterキーを押すとSTDINで読み込まれませんか? – Jake

+3

@Jake - いいえ。コンソールはあなたのプログラムへの入力だけを送信していて、プログラムはそれを読んでいません。あなたのコードによって入力が読み取られるまで、入力はバッファー内にあります。 –