select的fd超过1024将会非常危险------FD_SET导致core dump

   关于linux select无须多说, 来看代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<sys/time.h>
  6. #include<sys/types.h>
  7. int main(int argc, char *argv[])
  8. {
  9. if(argc != 2)
  10. {
  11. printf( "para error\n");
  12. return -1;
  13. }
  14. struct timeval tv; // 超时时间
  15. tv.tv_sec = 10;
  16. tv.tv_usec = 500; // 注意单位是微秒
  17. fd_set rdfds;
  18. FD_ZERO(&rdfds); // 描述集初始化
  19. unsigned int n = atoi(argv[ 1]);
  20. printf( "n is %u\n", n);
  21. for( unsigned int i = 0; i < n; i++)
  22. {
  23. FD_SET(i, &rdfds);
  24. }
  25. printf( "to select\n");
  26. select(n, &rdfds, NULL, NULL, &tv);
  27. return 0;
  28. }
       执行结果:

  1. xxxxxx:~/network&gt; g++ -g server.cpp
  2. server.cpp: 34: 2: warning: no newline at end of file
  3. xxxxxx:~/network&gt; ./a.out 2000
  4. n is 2000
  5. Segmentation fault (core dumped)
  6. xxxxxx:~/network&gt; gdb a.out core
  7. GNU gdb 6.6
  8. Copyright (C) 2006 Free Software Foundation, Inc.
  9. GDB is free software, covered by the GNU General Public License, and you are
  10. welcome to change it and/ or distribute copies of it under certain conditions.
  11. Type "show copying" to see the conditions.
  12. There is absolutely no warranty for GDB. Type "show warranty" for details.
  13. This GDB was configured as "i586-suse-linux"...
  14. Using host libthread_db library "/lib/libthread_db.so.1".
  15. warning: Can 't read pathname for load map: Input/output error.
  16. Reading symbols from / lib/libonion.so...done.
  17. Loaded symbols for / lib/libonion.so
  18. Reading symbols from /usr/ lib/libstdc++.so .6...done.
  19. Loaded symbols for /usr/ lib/libstdc++.so .6
  20. Reading symbols from / lib/libm.so .6...done.
  21. Loaded symbols for / lib/libm.so .6
  22. Reading symbols from / lib/libgcc_s.so .1...done.
  23. Loaded symbols for / lib/libgcc_s.so .1
  24. Reading symbols from / lib/libc.so .6...done.
  25. Loaded symbols for / lib/libc.so .6
  26. Reading symbols from / lib/libdl.so .2...done.
  27. Loaded symbols for / lib/libdl.so .2
  28. Reading symbols from / lib/ld-linux.so .2...done.
  29. Loaded symbols for / lib/ld-linux.so .2
  30. Core was generated by `
  31. Program terminated with signal 11, Segmentation fault.
  32. #0 0x080485af in main (argc=-1, argv=0xffffffff) at server.cpp:27
  33. 27 FD_SET(i, &amp;rdfds);
  34. (gdb)
        可见, 程序core在FD_SET处, 为什么呢, 看看linux源码中关于FD_SET的部分吧:

  1. static __inline__ void __FD_SET( unsigned long fd, __kernel_fd_set *fdsetp)
  2. {
  3. unsigned long _tmp = fd / __NFDBITS;
  4. unsigned long _rem = fd % __NFDBITS;
  5. fdsetp->fds_bits[_tmp] |= ( 1UL<<_rem);
  6. }
  7. #define __NFDBITS (8 * sizeof(unsigned long))
  8. typedef struct {
  9. unsigned long fds_bits [__FDSET_LONGS];
  10. } __kernel_fd_set;
  11. #define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)
  12. #define __FD_SETSIZE 1024

        一幕撩人, 一目了然。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值