https://www.dyxmq.cn/program/code/c-cpp/how-to-handle-eagin-and-ewouldblock-error-in-linux-c.html
--------------
EAGAIN
和EWOULDBLOCK
是linux環境下的兩個錯誤碼,在非阻塞IO中經常會碰到,對新手而言,如何處理這兩個值非常頭疼。如果處理不當,很容易導致程序異常。
EAGAIN
的官方定義:
“Resource temporarily unavailable.” The call might work if you try again later. The macro
EWOULDBLOCK
is another name forEAGAIN
; 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?。