Engineering/Network
linux 에서 fd_set MAX 변경
부스 boos
2010. 6. 14. 18:15
728x90
select 에서 사용하는 fd 는 최대 1024 개이다.
최대값을 변경하기 위해서는 "/usr/include/bits/typesizes.h" 의 __FD_SETSIZE 값을 변경하고, 컴파일해야한다.
/* Number of descriptors that can fit in an `fd_set'. */
#define __FD_SETSIZE 1024
참고로, fd 와 관련된 상수값들은
- "/usr/include/sys/select.h"
typedef long int __fd_mask;
#define __NFDBITS (8 * sizeof (__fd_mask))
typedef struct
{
__fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS];
} fd_set;
fd_set 를 살펴보면, 32 bit 에서는 fd_set 이 int32_t __fds_bits[32] 를 멤버를 가지고, 64 bit 에서는 int64_t __fds_bit[16] 를 멤버를 가진다. 결국 1024 개의 비트를 가지게 된다.
BSD 계통에서는 어떻게 되어 있는게 보니, FD_SETSIZE 가 256 으로 선언이 되어 있다.
/* * Implementation dependent defines, hidden from user space. X/Open does not * specify them. */ #define __NBBY 8 /* number of bits in a byte */ typedef __int32_t __fd_mask; /* bits per mask */ #define __NFDBITS ((unsigned int)sizeof(__fd_mask) * __NBBY) #define __howmany(x, y) (((x) + ((y) - 1)) / (y)) /* * Select uses bit masks of file descriptors in longs. These macros * manipulate such bit fields (the filesystem macros use chars). * FD_SETSIZE may be defined by the user, but the default here should * be enough for most uses. */ #ifndef FD_SETSIZE #define FD_SETSIZE 256 #endif typedef struct fd_set { __fd_mask fds_bits[__howmany(FD_SETSIZE, __NFDBITS)]; } fd_set;