Posix

POSIX select() 什麼時候真正返回?

  • May 2, 2018

我正在使用 POSIX 介面進行一些套接字程式。我正在嘗試使用 select() 函式來監視非阻塞套接字何時準備好進行讀/寫。

在使用 select() 函式時,我給了它一組讀寫文件描述符。具體來說,我有一個套接字 fd,我想檢查它是否既可讀又可寫。

POSIX 文件指出,返回值是所有 fd 集中所有文件描述符的總和。

我的早期測試表明我得到了一個很好的“2”(這意味著我的套接字既可讀又可寫)。但是,如果文件描述符沒有同時變為可讀/可寫,會發生什麼?假設它在變得可寫之前變得可讀一微秒?發生什麼了?它只返回一個 1 嗎?

select()當至少有一個文件描述符準備好讀取或寫入時,或者達到超時時間,或者被信號中斷時,將返回。

這意味著您必須select()在確定至少一個文件描述符已準備好讀取或寫入之後測試給定的文件描述符集(這些集由 修改select())。

成功完成後,pselect()orselect()函式**應修改 、 和 參數指向的對象readfdswritefdserrorfds分別指示哪些文件描述符已準備好讀取、準備好寫入或有錯誤條件未決,並應返回準備就緒的總數所有輸出集中的描述符。**對於小於 的每個文件描述符nfds,如果在輸入時設置相應位並且該文件描述符的關聯條件為真,則應在成功完成時設置相應位。

(來自POSIX 文件select()

如果您需要打開文件描述符以進行讀取和寫入,則必須循環select()直到滿足兩個條件。

引用自:https://unix.stackexchange.com/questions/441001