2013-05-12 138 views
0

我試圖從stdin使用select讀取,之後,我通過套接字發送數據到服務器。如何使用select從標準輸入讀取輸入?

下面的代碼片段應該遵循上面的邏輯;但它不會從stdin讀取任何內容。

此外,它在第一次用戶輸入字符串後打印Enter command:。行printf("%d %s\n",__LINE__ ,buf);不打印任何東西。

fd_set rfds; 
struct timeval tv; 
int retval; 
char buf[BUFLEN]; 
while(1) { 
    FD_ZERO(&rfds); 
    FD_SET(STDIN_FILENO, &rfds); 
    tv.tv_sec = 5; 
    tv.tv_usec = 0; 
    retval = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); 
    if (FD_ISSET(STDIN_FILENO, &rfds)) { 
     if (fgets(buf,BUFLEN, stdin)) { 
       printf("%d %s\n",__LINE__ ,buf); 
      if (strncmp(buf, "exit", 4) == 0) 
       exit(0); 
     } 
     printf("\nEnter command: "); 
    } 
} 

爲什麼我只能得到Enter command:無盡打印?

編輯:的問題是與我使用並以某種方式對其進行編譯與-fpic解決了這一問題的嵌入式設備。

+0

添加'fflush(NULL);'只是'select'之前(以及'FD_ZERO'和'FD_SET' ....)或更好地使用[民意調查(2)](http://man7.org/linux/man-pages/man2/poll.2.html),而不是'選擇' – 2013-05-12 18:52:22

+1

你是否按命令後輸入? – 2013-05-12 18:53:22

+0

@VaughnCato是... – 0x90 2013-05-12 18:53:44

回答

2

嘗試

FD_ZERO(&rfds); 
FD_SET(STDIN_FILENO, &rfds); 

在while循環

+0

謝謝你,即使你是ri,也不能解決問題GHT。編輯我的問題。 – 0x90 2013-05-12 19:55:40