linux 如何查看文件描述符是否被释放

     因为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 

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 文件描述

 

 

你可能感兴趣的:(网络编程)