[英]reentrant function read()
我通過select()
找到了一個服務器,我想從一些客戶端收到它。
但我發現服務器將被gdb阻塞在read()
。
所以我想通過添加一個SIGALRM
來解決它,但是當發生超時時,它仍然在read()
被阻塞。
發生這種情況是因為,系統調用會自動重新啟動,當SIGALRM信號處理程序返回時, read()
不會中斷。
這種解釋是否正確?
這個問題的通常解決方案是使用SOCK_NONBLOCK
來socket(2)
或O_NONBLOCK
到fcntl(2)
的F_SETFL
命令。 一旦套接字被標記為非阻塞,當你嘗試從它讀取它時它永遠不會阻塞,你不需要嘗試跨越阻塞或非阻塞之間的鴻溝。 你確定select(2)
設置文件描述符嗎? select(2)
聯機幫助頁確實描述了您看到所見內容的一個原因,但似乎不太可能:
在Linux下,
select()
可以將套接字文件描述符報告為“准備好讀取”,而不是后續的讀取塊。 這可能例如在數據到達時發生但在檢查時具有錯誤的校驗和並被丟棄。 可能存在其他情況,其中虛假地報告文件描述符為就緒。 因此,在不應阻塞的套接字上使用O_NONBLOCK
可能更安全。
如果您真的只想阻止自動重啟,請在sigaction(2)
查看SA_RESTART
以防止重新啟動系統調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.