嵌入式select之檔案描述符限制篇

2021-10-24 08:03:50 字數 1783 閱讀 5996

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 開啟乙個檔案...