select系統呼叫可以實現乙個程序同時監聽多個檔案描述符的狀態變化,但select 對於乙個程序所開啟的fd是有一定限制的,最大的檔案描述符需小於1024,即檔案描述符的範圍【0-1023】。
select支援的描述符為什麼會有限制呢?能不能修改呢?
select支援的檔案描述符是在#include 的巨集定義定死的,所以有侷限性,但並不是說檔案描述符一定就不能超過1024,因為巨集定義的值是可以人為修改的,但比較麻煩,修改巨集定義的值,需要重新編譯核心。但為什麼檔案描述符要限定在1024呢?而不是其他的值。
從兩個方面分析
1、乙個程序所開啟的最大檔案描述符也是小於1024,設定為小於1024是比較合理的
2、select採用的是輪詢處理的方式,處理過多的描述符開銷比較大,會大大降低效能。
define fd_setsize 1024
檔案描述符是如何儲存的?
select之檔案描述符是由d_set型別管理的,d_set型別實際是是乙個unsigned long型、大小為32的陣列。一共有32位位元組、32*32=1024位(bit),每一位都可以表示乙個描述符,共支援1023個檔案描述符。比如:將檔案描述符4載入到readfds中,實際4檔案描述符的儲存方式就是fds_bits[0] = 0b0000000000001000。
fd_set readfds;
fd_set(4,readfds);
fds_bits[0]
=0b0000000000001000
select之檔案描述符的組織實現**:
define fd_setsize 1024
typedef
unsigned
long fd_mask;
#define nbby 8
/* number of bits in a byte */
#define nfdbits (sizeof(fd_mask) * nbby)
/* bits per mask */
#define howmany(x, y) (((x) + ((y) - 1)) / (y))
typedef
struct fd_set
fd_set;
#define _fdset_mask(n) ((fd_mask)1 << ((n) % nfdbits))
#define fd_set(n, p) ((p)->fds_bits[(n)/nfdbits] |= _fdset_mask(n))
#define fd_clr(n, p) ((p)->fds_bits[(n)/nfdbits] &= ~_fdset_mask(n))
#define fd_isset(n, p) ((p)->fds_bits[(n)/nfdbits] & _fdset_mask(n))
#define fd_copy(f, t) bcopy(f, t, sizeof(*(f)))
#define fd_zero(p) bzero(p, sizeof(*(p)))
測試select支援的最大描述符例程:
#include
#include
intmain()
intmain()
注:一般select支援的最大描述符例程都是1024. mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
linux之檔案描述符
檔案描述符是乙個非負整數。按照慣例,unix系統shell把檔案描述符0與程序的標準輸入關聯,檔案描述符1與標準輸出關聯,檔案描述符2與標準錯誤關聯。當應用程式開啟乙個現有檔案或者建立乙個新檔案時,核心會向程序返回乙個檔案描述符。對於核心而言,所有開啟的檔案都通過檔案描述符引用。上圖基本描繪出了檔案...
檔案描述符
檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...