fd_set是一種資料型別,在select函式中包含了3個引數,就是這個fd_set型別,fd_set也是理解select模型的關鍵,關於select的具體說明,可以參考之前的文章嵌入式linux程式設計之select使用總結。
select可以同時對多個檔案描述符的狀態去監聽,那麼這個所謂的「多個」的實現就是通過fd_set來實現的, 簡單的說:
fd_set是select監聽描述符的集合,每個描述符集儲存在乙個fd_set資料型別中,這個資料型別為每乙個可能的描述符保持1位,所以我們可以認為它是乙個很大的位元組陣列。
上面的話,可能會有些讓人迷糊,之所以迷糊的原因就是, 檔案描述符可大可小,是隨意的,可以使1、2、3等等,那這個具體的數,怎麼只能有1位來實現呢,為了說明問題,我們先假定 fd_set 的長度只有1個位元組,也就是只有8bit,那麼1個位元組長的fd_set最大可以對應8個檔案描述符(fd),
fd_set set;
* 執行 fd_zero( &set ),則先對set進行清零
* 若fd = 5,執行fd_set(fd, &set)後,set變成 0001 0000 (第5為是1)
* 若在加入 fd = 1,和fd = 2,進行fd_set後,set變成 0001 0011
* 執行 select(5 + 1, &set, 0, 0, 0)阻塞等待
* 若任意fd發生可讀事件,比如fd=5,發生可讀事件,則set變成 0001 0000,也就是沒有事件發生的fd(1、
* 2)會被清空。
那麼問題來了,如果檔案描述符是100怎麼辦?答案很簡單,fd_set並不是指有1個位元組,可以有n個位元組,可以拿多個位元組湊多個bit,如果fd是100,仍然可以執行 fd(100, &set),執行後,set的值為 1*********xx............,其中「1」就是第99個bit(從0開始)。
至於fd_set的最大為多少,取決於機器,一般 是夠用的,因為linux在分配檔案描述符的時候,不是隨意分配 個幾千幾萬的,這個是比較寶貴的資源,是從小到大,一點點遞增的,誰也不會傻到同時開啟幾萬個檔案的。
Linux下select 機制中fd set用法
select 機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fe set的內容,由此...
Linux 下DNS配置小結
1.安裝參見 2.自己的配置 主配置檔案 etc named.conf options listen on v6 port 53 directory var named dump file var named data cache dump.db statistics file var named ...
Linux下ps命令小結
1 ps a 顯示現行終端機下的所有程式,包括其他使用者的程式。2 ps a 顯示所有程式。3 ps c 列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,引數或常駐服務的標示。4 ps e 此引數的效果和指定 a 引數相同。5 ps e 列出程式時,顯示每個程式所使用的環境變數。6 ps f ...