因为linux编程中一切皆是文件,如socket,文本文件,db,flash,等等,尤其是网络编程中server端的socket,经过三次握手以后,经常忘记处理socket,最终导致整个进程的文件描述符耗尽;在linux写程序中经常遇到fd忘记close的情况,也会出现文件描述符耗尽的情况,如下手段可以帮助大家查看文件描述符是否忘记close。

 

1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:

/proc/sys/fs/file-max
2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:

         [root@localhost logs]# cat /proc/sys/fs/file-nr

 

2112   0  2100000
已分配文件句柄的数目  已使用文件句柄的数目 文件句柄的最大数目 

 

 

 

已分配文件句柄的数目:如果忘记close文件描述符,这个值会不断变大,所以在做压力测试的时候,要特别注意这种情况。

 

使用c语言获取

       

#include <stdio.h>

typedef struct        
{
    unsigned int assigned;/*已分配文件句柄的数目    */      
    unsigned int used;/*文件句柄的最大数目*/ 
    unsigned int total;/*文件句柄的最大数目*/                       
}system_info_fd_t;

static void ptcp_server_get_sys_fd_info(system_info_fd_t *info_fd) 
{
    FILE *fd;          
    char buff[256];   
    fd = fopen ("/proc/sys/fs/file-nr", "r"); 
    fgets (buff, sizeof(buff), fd); 
    sscanf (buff, "%u    %u    %u", &info_fd->assigned, &info_fd->used,&info_fd->total); 
    fclose(fd);    
}

3)单个进程允许打开的最大fd数量.查询语句:

ulimit -n
4)单个进程(例如通过ps -aux查看到关心的进程id为655)已经打开的fd.查询语句:

ls -l /proc/655/fd/ | wc -l 可以查看到fd不断增大,这样就可以确认是那个进程忘记close 文件描述

 

 

GitHub 加速计划 / li / linux-dash
13
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:4 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐