select的fd超過1024將會非常危險------FD_SET導致core dump
阿新 • • 發佈:2018-12-22
關於linux select無須多說, 來看程式碼:
- int main(int argc, char *argv[])
- {
-
if
- {
- printf( "para error\n");
- return -1;
- }
-
struct
- tv.tv_sec = 10;
- tv.tv_usec = 500; // 注意單位是微秒
- fd_set rdfds;
- FD_ZERO(&rdfds); // 描述集初始化
- unsigned int n = atoi(argv[ 1]);
- printf( "n is %u\n", n);
- for( unsigned int i = 0; i < n; i++)
- {
- FD_SET(i, &rdfds);
- }
- printf( "to select\n");
- select(n, &rdfds, NULL, NULL, &tv);
- return 0;
- }
- xxxxxx:~/network> g++ -g server.cpp
- server.cpp: 34: 2: warning: no newline at end of file
- xxxxxx:~/network> ./a.out 2000
- n is 2000
- Segmentation fault (core dumped)
- xxxxxx:~/network> gdb a.out core
- GNU gdb 6.6
- Copyright (C) 2006 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License, and you are
- welcome to change it and/ or distribute copies of it under certain conditions.
- Type "show copying" to see the conditions.
- There is absolutely no warranty for GDB. Type "show warranty" for details.
- This GDB was configured as "i586-suse-linux"...
- Using host libthread_db library "/lib/libthread_db.so.1".
- warning: Can 't read pathname for load map: Input/output error.
- Reading symbols from / lib/libonion.so...done.
- Loaded symbols for / lib/libonion.so
- Reading symbols from /usr/ lib/libstdc++.so .6...done.
- Loaded symbols for /usr/ lib/libstdc++.so .6
- Reading symbols from / lib/libm.so .6...done.
- Loaded symbols for / lib/libm.so .6
- Reading symbols from / lib/libgcc_s.so .1...done.
- Loaded symbols for / lib/libgcc_s.so .1
- Reading symbols from / lib/libc.so .6...done.
- Loaded symbols for / lib/libc.so .6
- Reading symbols from / lib/libdl.so .2...done.
- Loaded symbols for / lib/libdl.so .2
- Reading symbols from / lib/ld-linux.so .2...done.
- Loaded symbols for / lib/ld-linux.so .2
- Core was generated by `
- Program terminated with signal 11, Segmentation fault.
- 27 FD_SET(i, &rdfds);
- (gdb)
- static __inline__ void __FD_SET( unsigned long fd, __kernel_fd_set *fdsetp)
- {
- unsigned long _tmp = fd / __NFDBITS;
- unsigned long _rem = fd % __NFDBITS;
- fdsetp->fds_bits[_tmp] |= ( 1UL<<_rem);
- }
- typedef struct {
- unsigned long fds_bits [__FDSET_LONGS];
- } __kernel_fd_set;
一幕撩人, 一目瞭然。