recv()方法返回EWOULDBLOCK錯誤


 

https://www.dyxmq.cn/program/code/c-cpp/how-to-handle-eagin-and-ewouldblock-error-in-linux-c.html

--------------

 

EAGAINEWOULDBLOCK是linux環境下的兩個錯誤碼,在非阻塞IO中經常會碰到,對新手而言,如何處理這兩個值非常頭疼。如果處理不當,很容易導致程序異常。

EAGAIN的官方定義:

“Resource temporarily unavailable.” The call might work if you try again later. The macro EWOULDBLOCK is another name for EAGAIN; they are always the same in the GNU C Library.

翻譯:資源短暫不可用,這個操作可能等下重試后可用。它的另一個名字叫做EWOULDAGAIN,這兩個宏定義在GNU的c庫中永遠是同一個值。

EWOULDBLOCK的定義:

“Operation would block.” In the GNU C Library, this is another name for EAGAIN (above). The values are always the same, on every operating system.

翻譯:操作將會被阻塞,在GNU C的庫中,它的另外一個名字是EAGAIN,在任何操作系統中他們兩個的值都是一樣的。

這兩個錯誤碼在大多數系統下是都同一個東西,特別是在使用了GNU的libc庫平台(目前廣泛使用的centos和ubuntu都是)下一定是相同的。這個錯誤產生的情況:

  • 嘗試在一個設置了非阻塞模式的對象上執行阻塞操作,重試這個操作可能會阻塞直到其他條件讓它可讀、可寫或者其他操作。
  • 對某些操作來說,資源短暫不可用。例如fork函數可能返回這個錯誤(當沒有足夠的資源能夠創建一個進程時),可以采取的操作是休息一段時間然后再繼續操作。

那么應該如何處理這個錯誤?

最好的辦法是重試,重試一定次數后還不成功就退出操作。

為什么不能無限重試呢?假設在通過socket發送一段數據,發送緩沖區如果一直不可寫,就會出現無限循環的情況,進程卡死。

其他

在某些較老的unix系統上,這兩個值的意義可能不一樣。

可以參考:Which systems define EAGAIN and EWOULDBLOCK as different values?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM