FD_SET设置的文件描述符超过1024引发coredump

news/2025/3/23 6:26:35/

FD_SET设置的文件描述符超过1024引发coredump

在开发过程中,遇到一个coredump的问题,最后排查到是FD_SET的文件描述符大于1023

1. 写一个例子来触发

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/types.h>
#include<pthread.h>int do_loop(){int buf[10];for (int i = 0;i<10;i++){buf[i] = 1;}return 0;
}void* do_func(void* arg){while(1){do_loop();}return NULL;
}int main(int argc, char *argv[])
{fd_set rdfds;FD_ZERO(&rdfds);                unsigned int n = 0;n = atoi(argv[1]);//通过输入参数来设置文件最大的文件描述符大小printf("n = %d\n",n);for(unsigned int i = 0; i < n; i++){FD_SET(i, &rdfds);}printf("to select\n");pthread_t thread;pthread_create(&thread,NULL,do_func,NULL);while(1){sleep(5);}return 0;
}}

2、开始执行

[root@xxx-14121 test]# ./a.out 1
n = 1
to select
^C
[root@xxx-14121 test]# ./a.out 1024
n = 1024
to select
^C
[root@xxx-14121 test]#
[root@xxx-14121 test]#
[root@xxx-14121 test]# ./a.out 1027
n = 1027
to select
^C
[root@xxx-14121 test]# ./a.out 1100
n = 1100
to select
^C
[root@xxx-14121 test]# ./a.out 1200
n = 1200
Segmentation fault (core dumped)

这种问题就更坑人了,并不是只要超过1023就会必现,到1200就快复现了

3、gdb调试

gdb ./a.out /tmp/core-a.out-1397671-1691736607
GNU gdb (GDB) openEuler 11.1-1.oe2203
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-openEuler-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...
[New LWP 1397671]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
Core was generated by `▒▒▒▒▒▒▒▒▒▒▒▒▒'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000401231 in main (argc=2, argv=0x7ffc27a031e8) at fd_set.c:36
36                      FD_SET(i, &rdfds);
(gdb) bt
#0  0x0000000000401231 in main (argc=2, argv=0x7ffc27a031e8) at fd_set.c:36

这里还好,最起码gdb报的行数是在36,在FD_SET这行,在自己的开发环境就没这么好了

3、内核里面 FD_SET的定义

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);
}#define __NFDBITS    (8 * sizeof(unsigned long))typedef struct {unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;#define __FDSET_LONGS   (__FD_SETSIZE/__NFDBITS)#define __FD_SETSIZE    1024

__NFDBITS是一个定值64 ,在64位机上
__FDSET_LONGS 是一个定值(1024/64)在64位机上,fds_bits数组的长度就是(1024/64)
当fd大于 1023的时候就数组越界了,就会出现稀奇古怪的问题了

总结:FD_SET(i, &rdfds);其中i不能大于1023,要不然就会出现不可控的问题,如果一个进程打开的文件描述符超过了1023,又要用select进行监听,就会踩到这个坑

http://www.biegral.com/index/View/03974639-1614-4a5a-bec7-dbb72d19ca24


http://www.ppmy.cn/news/1023955.html

相关文章

VR家装提升用户信任度,线上体验家装空间感

近些年&#xff0c;VR家装逐渐被各大装修公司引入&#xff0c;VR全景装修的盛行&#xff0c;大大增加了客户“所见即所得”的沉浸式体验感&#xff0c;不再是传统二维平面的看房模式&#xff0c;而是让客户通过视觉、听觉、交互等功能更加真实的体验家装后的效果。 对于传统家装…

将达梦DM8数据库JDBC驱动注册到本地Maven仓库安装

这里写目录标题 1下载DmJdbcDriver18.jar2,以管理员身份运行CMD窗口&#xff0c;然后执行如下安装命令&#xff1a;3.pom文件添加引用 1下载DmJdbcDriver18.jar 我本地放在d:\DmJdbcDriver.jar 2,以管理员身份运行CMD窗口&#xff0c;然后执行如下安装命令&#xff1a; mvn …

虚拟机centos7配置网络

虚拟机centos7配置网络 centos7克隆之后需要配置网络才能联网。 实验环境&#xff1a; VMware Workstation Pro 16CentOS 7系统虚拟机主机Windows 11系统 1.VMware网络模式设置为NAT模式 虚拟机–设置–网络适配器– ​​ ‍ 2.查看虚拟机 子网IP和网关IP 编辑–虚拟网…

E8-怎么修改流程表单里现有字段的类型

起因 排版一个流程的表单&#xff0c;明细表里有一个单行文本框&#xff0c;类型是浮点数&#xff0c;小数位数是2位。觉得这个字段用整数完全够用。于是就想怎么把它给改了。但各节点的表单已经做完了&#xff0c;如果删除原有字段&#xff0c;再新建一个整数量类型字段&…

用于雷达横截面计算的射击和弹跳射线方法,使用在 GPU 上运行的 BVH算法进行加速_C++

第一部分&#xff1a;用于雷达横截面计算的射击和弹跳射线方法&#xff0c;使用在 GPU 上运行的 BVH算法进行加速_C 雷达横截面&#xff08;RCS&#xff09;是一个重要的参数&#xff0c;用于描述目标在雷达探测中的反射特性。在现代防御系统中&#xff0c;RCS的计算和优化是至…

酒吧座位全解析 小白必看

相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分&#xff0c;下面我简单解说一下&#xff0c;如有错漏&#xff0c;欢迎指正&#xff01;一、吧台吧台是酒吧的核心部位&#xff0c;走进酒吧门&#xff0c;首先映入眼帘的就是吧台&#xff0c;一排人围着吧台几…

【什么是应变波齿轮又名谐波驱动?机器人应用的完美齿轮组!?】

什么是应变波齿轮又名谐波驱动&#xff1f;机器人应用的完美齿轮组&#xff01;&#xff1f; 1. 什么是应变波齿轮&#xff1f;2. 工作原理3. 应变波齿轮 – 谐波驱动 3D 模型4. 3D 打印应变波齿轮 – 谐波驱动5. 总结 在本教程中&#xff0c;我们将学习什么是应变波齿轮&#…

数字孪生和元宇宙之间的差别与联系是什么?

元宇宙和数字孪生是两个引人瞩目的概念&#xff0c;它们在虚拟与现实世界的交汇点上呈现出独特的视角和应用。虽然二者都涉及数字化和模拟技术&#xff0c;但在其差异与联系上&#xff0c;我们可以发现深刻的内涵和潜力。 首先&#xff0c;元宇宙是一个更为宽泛的概念&#xf…