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

这篇具有很好参考价值的文章主要介绍了FD_SET设置的文件描述符超过1024引发coredump。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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文章来源地址https://www.toymoban.com/news/detail-640813.html

到了这里,关于FD_SET设置的文件描述符超过1024引发coredump的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <Linux> 基础IO(文件操作、文件描述符fd、重定向)

    1、空文件也要在磁盘占用 我们创建的文件,虽然里面并没有存放数据,但是文件属性也是数据,即便你创建一个空文件,也要占据磁盘空间 2、文件 = 文件内容 + 文件属性 文件内容就是真正写入的内容,文件属性就是文件名、文件大小、文件的权限、拥有者所属组…… 3、文

    2024年02月03日
    浏览(36)
  • 【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:了解在Linux下的系统文件IO,知道什么是文件描述符,什么是重定向 毒鸡汤:白日莫闲过,青春不再来。 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 最早我们在C语言中学习关于如何用代码

    2024年04月14日
    浏览(40)
  • 系统文件IO、文件描述符fd、重定向、文件系统、动态库和静态库

    C文件接口 C文件接口都是封装了系统的文件接口,学习系统的文件接口有利于更熟悉文件的操作。 open函数 头文件 #include sys/types.h #include sys/stat.h #include fcntl.h 函数描述 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 参数 pathname: 要打开或创建的目

    2024年02月07日
    浏览(34)
  • 【linux深入剖析】文件描述符 | 对比 fd 和 FILE | 缓冲区

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 通过对open函数的学习,我们知道了文件描述符就是一个小整数 而现在知道,文件描述符就是从0开始的小

    2024年04月13日
    浏览(39)
  • ERROR > ES : too_many_clauses: maxClauseCount is set to 1024

    ES 在查询 Elasticseach 时,报错: 原因可能有2种,分别是: 1、查询语句中的 bool 查询的 条件 过多 2、查询语句中的 bool 查询的 字符 过多 相应的解决方法: 1、拆分查询语句中的 bool 查询条件,修改为多个小的 bool 条件组合的方式 2、在 elasticsearch.yml 配置中调大对 bool 的限制

    2024年02月11日
    浏览(49)
  • Elasticsearch-7.10.2查询时报错:failed to create query: maxClauseCount is set to 1024

    具体报错信息如下: {   \\\"error\\\": {     \\\"reason\\\": \\\"Error occurred in Elasticsearch engine: all shards failed\\\",     \\\"details\\\": \\\"\\\"\\\"Shard[0]: [2022/N0zTB2l7SiS4W1lvCNAsBg] QueryShardException[ failed to create query: maxClauseCount is set to 1024 ]; nested: TooManyClauses[maxClauseCount is set to 1024]; For more details, please send request for Json

    2024年02月13日
    浏览(34)
  • 文件fd.

    共识原理: 1.文件 = 内容 + 属性 2.文件分为打开的文件 和 没打开的文件 3.打开的文件: 谁打开? 进程! ----本质是研究进程和文件的关系! 根据冯诺依曼原理,文件被打开,必须先被加载到内存!不然CPU怎么访问它 那么是文件内容被加载?还是属性被加载?还是都被加载? 一定

    2024年02月06日
    浏览(29)
  • Emacs之改造最快的文件搜索工具fd-dired(基于fd命令)(一百二十一)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月15日
    浏览(32)
  • 【Linux】基础IO——系统文件IO&&fd&&重定向

    大家好我是沐曦希💕 空文件,也要在磁盘占据空间,因为文件也有属性,属性也属于数据,需要空间进行存储。所以 文件包括内容和属性 所以 对文件操作就是对内容或者对属性进行操作,或者对内容和属性进行操作。 文件具有唯一性,所以在 标定一个文件时候,必须使用

    2024年02月02日
    浏览(37)
  • 浅谈对属性描述符__get__、__set__、__delete__的理解

    1.1 何为属性描述符? 属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为。属性描述符可以通过定义 __get__、__set__、__delete__ 方法来控制属性的读取、赋值和删除操作。 通过使用属性描述符,可以实现对属性的访问控制、类型检查、计算属性等高级功能

    2023年04月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包