2012-04-18 30 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被檢測到,消息「的用戶輸入 - 標準輸入」輸入保持在印刷.. 。爲什麼不打印一次,然後在while循環中檢查哪些描述符已經輸入?

謝謝。

回答

8

select函數只會告訴你何時有輸入可用。如果你沒有真正消費它,選擇將繼續直行。

3

因爲你沒有閱讀STDIN,所以下一次循環還有一些東西需要閱讀。

您需要閱讀STDIN以防止出現這種情況。

+0

如果我有一個正在運行的程序,並且我在控制檯上鍵入任何文本並按Enter鍵,那麼STDIN不會讀取它嗎? – Jake 2012-04-18 23:06:44

+3

@Jake - 不是。控制檯只是將輸入發送給你的程序,而你的程序沒有讀取它。輸入在緩衝區中,直到您的代碼被讀取。 – 2012-04-18 23:08:40