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