본문 바로가기

TroubleShooting/Network

linux 에서 fd_set MAX 변경

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;