2013-12-16 172 views
1

我遇到了一個問題,其中FD_SET正在崩潰我的程序。我正在運行提升Boost ASIO sample HTTP Server的示例代碼。在請求處理程序中,我把第三方的API最終做出以下電話:FD_SET導致seg故障

fd_set fds; 
FD_ZERO(&fds); 
FD_SET(sockfd, &fds); 

我的程序似乎是在FD_SET崩潰。是否有從不同線程調用FD_SET會導致段錯誤的情況?我不確定FD_SET是如何工作的,我的直覺就是我在已經使用的fd上打電話FD_SET。這會導致問題嗎?

sockfd是一個類成員,它在每次請求進入時創建,所以我不應該在線程之間共享一個sockfd變量。

+0

你是什麼意思「似乎」?你不能使用調試器來確認嗎? – 2013-12-16 18:41:30

+1

你是否檢查過'sockfd'是肯定的,並且少於'FD_SETSIZE'? –

+0

它不會每一次都崩潰,只有當我的服務器運行在1000請求/秒左右時纔會崩潰。我所擁有的只是一個回溯,這並沒有給我準確的界限。當我註釋掉代碼+代碼後,程序將運行正常。一旦那條線在那裏,程序崩潰。 – Eumcoz

回答

3

在1000個請求/秒你很可能在黯然失色的undefined behavior限制FD_SETSIZE(通常在Linux 1024),這導致:

一種的fd_set是固定大小的緩衝區。執行FD_CLR()FD_SET()與 FD爲負或等於或大於 FD_SETSIZE較大將導致未定義的行爲的值。而且,POSIX要求 fd是一個有效的文件描述符。

你應該看看使用pollepoll,或更高級別的圖書館像Boost Asio。任何這些選擇都不會有select的限制。