我從我的應用程序移除提升(因爲我想擺脫提升的同時,使用預先C++ 11)和相同的一部分,我遇到了以下問題。的sockfd在SIGINFO結構爲SIGIO信號
我有一段代碼,其連接,請求和異步使用boost(async_connect,ASYNC_WRITE和async_read呼叫)從遠程服務器接收數據。我打算用在異步模式下運行的linux本地套接字替換它。
對於相同的我開始看 ioctl(_sockfd,FIOASYNC,& on); 以異步模式設置套接字。 接着我還設置 的fcntl(_sockfd,F_SETOWN,GETPID()); 將所有與sockfd相關的信號發送到創建套接字的進程。處理SIGIO信號可訪問包含各種信號相關信息的siginfo_t結構。
但是我無法獲得從SIGINFO結構實例的sockfd收到這使得它很難破譯其中的sockfd; S SIGIO信號已經被抓住了。 si-> si_fd不匹配連接被調用的_sockfd。 爲什麼在SIGINFO確實的fd爲SIGIO犯規匹配指此信號產生所述的sockfd。 siginfo的內容是否可靠?
我建議你忽略信號API並使用select()或poll()實現你的套接字處理,信號在多線程和麪向對象的設計中都不能很好地發揮作用,並且如果你需要異步套接字C++有一個很大的機會,你將需要兩個。 – gabry
您是否在使用sigaction()建立信號處理程序時設置了'SA_SIGINFO'?另見https://stackoverflow.com/questions/19866754/sigio-arriving-for-file-descriptors-i-did-not-set-it-for-and-when-no-io-is-possi – nos