Linux EINTR 錯誤碼

在類 Unix 操作系統中(當然也包括 Linux 系統),當我們調用一些 socket 函數時(connect、send、recv、epoll_wait 等),除了函數調用出錯會返回 -1,這些函數可能被信號中斷也會返回 -1,此時我們可以通過錯誤碼 errno 判斷是不是 EINTR 來確定是不是被信號中斷。在實際編碼的時候,請讀者務必要考慮到這種情況。這也是上文中很多代碼要專門判斷錯誤碼是不是 EINTR,如果是,說明被信號中斷,我們需要再次調用這個函數進行重試。千萬不要一看到返回值是 -1,草草認定這些調用失敗,進而做出錯誤邏輯判斷。

bool SendData(const char* buf , int buf_length)
{
//已發送的位元組數目
int sent_bytes = 0;
int ret = 0;
while (true)
{
ret = send(m_hSocket, buf + sent_bytes, buf_length - sent_bytes, 0);
if (nRet == -1)
{
if (errno == EWOULDBLOCK)
{
//嚴謹的做法,這裡如果發不出去,應該緩存尚未發出去的數據,後面介紹
break;
}
else if (errno == EINTR)
continue;
else
return false;
}
else if (nRet == 0)
{
return false;
}

sent_bytes += ret;
if (sent_bytes == buf_length)
break;

//稍稍降低 CPU 的使用率
usleep(1);
}

return true;
}


本文首發於『easyserverdev』公眾號,歡迎關注,轉載請保留版權信息。

歡迎加入高性能伺服器開發 QQ 羣一起交流: 578019391 。

推薦閱讀:

相關文章