我有一個服務器/客戶端的設定,它們之間有很多連接。大量發送的資料。selector系統呼叫將poll許多檔案描述符回傳為準備好寫入。但是,當我繼續寫入資料時,最終,我得到了第 N 個檔案描述符EAGAIN,寫入了零位元組。這在很大程度上仍在繼續。
據我所知,它是內部內核緩沖區,被填滿了。所以其余的檔案描述符在syscall喚醒時沒有資料發送。
我的問題是,是否所有檔案描述符都以公平的方式發出信號?我的意思是,從檔案描述符的總數中,第一組得到信號并被移動到可寫佇列的尾部。如果不是,那么如何克服上述問題,如何使所有需要資料傳輸的套接字都受到相當多的關注?
作為一個問題的結果,如果EAGAIN開始出現,我可以跳過事件回圈嗎?
我用 C 撰寫程式,歡迎代碼參考和解釋。
uj5u.com熱心網友回復:
我的問題是,是否所有檔案描述符都以公平的方式發出信號?
兩者poll和select都將回傳有關在呼叫回傳的瞬間哪些檔案描述符當前可讀/可寫的資訊。這是“公平的”,因為它們都被同時指出。您將需要遍歷所有描述符并寫入每個可寫的描述符。如果你愿意,你可以決定更喜歡一些,或者讓你的回圈更公平。
當您write訪問一個描述符時,它將回傳EAGAIN或EWOULDBLOCK為任何一個非阻塞且沒有緩沖區空間的描述符。每個 fd 都有自己的緩沖區,因此在一個 fd 上發生的這種情況與任何其他 fd 無關,它們可能仍然是可寫的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512342.html
