2010-04-29 50 views
3

我只是想知道在C中是否可以查看輸入緩衝區或執行類似的技巧來知道對fgets的調用是否會在稍後時間阻塞。 Java允許通過調用BufferedReader.ready()做類似的東西,這樣我可以實現控制檯輸入這樣的事情:檢查fgets是否會阻塞

while (on && in.ready()) { 
    line = in.readLine(); 
    /* do something with line */ 
    if (!in.ready()) 
    Thread.sleep(100); 
} 

這允許外部線程正常關閉通過設置爲false,輸入迴路;我想在C中執行一個類似的實現,而不使用非可移植的技巧,我已經知道我可以通過使用信號或者(更好的是,儘管需要照顧緩衝)來實現unix下的「超時fgets」它在recv/select之上,但我更喜歡一些可以在windows上工作的東西。

TIA

+0

在windows上選擇作品:http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx – nc3b 2010-04-29 09:09:29

+3

@ nc3b:Windows'select'函數只適用於套接字。 – 2010-04-29 09:14:34

+1

@Marcelo Cantos:哦,對不起,不知道:「> – nc3b 2010-04-29 09:17:00

回答

1

推薦去與套接字I/O程序,優選輪詢()與所需的毫秒超時,最終可以解釋超時(返回值= -1)作爲輸入緩衝器中的數據的可用性。
在我看來,沒有非阻塞的標準I/O函數來實現這個功能。

0

我不確定你在說什麼:套接字或文件句柄?

對於文件應該沒有阻塞。函數立即返回(除了I/O調用本身)。

對於插座 - 您可以使用ioctlsocket功能: 下面講述,如果有一個RCV數據待發:

ULONG nEnable = 1; 
ioctlsocket(sock, FIONBIO, &nEnable); 

ULONG nSize; 
ioctlsocket(sock, FIONREAD, &nSize); 

插座成非阻塞模式下傳輸處於非阻塞模式時 - 套接字上的函數永不阻塞。如果他們不能滿足要求,他們將返回一個錯誤,並且錯誤代碼是WSAEWOULDBLOCK

另外,在Windows上有幾十個更有效的方法。這些是:

  • 使用重疊的I/O。這是不重要的,但性能優越
  • 將套接字與等待事件相關聯。這會將套接字轉換爲非阻塞模式,並且在網絡事件發生時指定的事件會發出信號。
  • 將它與窗口句柄關聯起來。這對於面向UI的程序很方便。
相關問題