Fw: [問題] C的select問題

看板C_and_CPP作者 (SunOS 5.11)時間12年前 (2012/07/06 15:00), 編輯推噓1(109)
留言10則, 5人參與, 最新討論串1/1
※ [本文轉錄自 Wanted 看板 #1FzehSmd ] 作者: OpenSolaris (SunOS 5.11) 看板: Wanted 標題: [問題] C的select問題 時間: Fri Jul 6 14:51:06 2012 最近剛學C的select,但是現在遇到一個問題, 當某個設備讀到東西時,會觸發一段function。 這部分實做是ok,但是我想寫一個迴圈, 讀到東西後,清空重讀。 卻怎麼都寫不出來: 這是我試驗的code: ============================================ #include <stdio.h> #include <sys/types.h> #include <sys/select.h> #define STDIN 0 main() { int n=1; while (2) { struct timeval tv; fd_set readfds; tv.tv_sec = 1; tv.tv_usec=0; 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"); } printf("%d\n",n); n=n+1; } 如果沒東西,它會每秒顯示timeout。但是只要按一下<enter> 整個迴圈就迅速跑起來,猛顯示A key was pressed! 我想要的是顯示一次後就被清空等待輸入。 不曉得要如何處理,希望各位大師能教我,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.201.142.21 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: OpenSolaris (122.201.142.21), 時間: 07/06/2012 15:00:19

07/06 15:32, , 1F
你沒有把kb傳回來東西讀出來,所以那個fd一直是input avalable
07/06 15:32, 1F

07/06 15:35, , 2F
為了把fb清空又不被block,我是用nonblocking io
07/06 15:35, 2F

07/06 16:31, , 3F
沒有結束啊...你想怎麼結束while()?
07/06 16:31, 3F

07/06 16:32, , 4F
把2改成條件式..或是用if 配合break?
07/06 16:32, 4F

07/06 16:34, , 5F
講錯了...應該問FD_ISSET內容是什麼才對@@
07/06 16:34, 5F

07/06 17:04, , 6F
想問一下當FD_ISSET=1的時候,什麼情況才能讓它再回0?
07/06 17:04, 6F

07/06 20:43, , 7F
用fgets把資料讀走?
07/06 20:43, 7F

07/06 22:58, , 8F
FD_ZERO把readfds清空再FD_SET回來
07/06 22:58, 8F

07/06 23:00, , 9F
因為select會把readfds改掉
07/06 23:00, 9F

07/07 00:59, , 10F
我開始懂了,會再試試,謝謝大家。
07/07 00:59, 10F
文章代碼(AID): #1Fzeq4Vl (C_and_CPP)