维基百科:文件描述符是一种形式上的非负整数。其实就是一个索引值,指向内核为每个进程维护的进程打开文件的记录表。当程序打开现有文件或创建新文件时,内核会向进程返回一个文件描述符。在编程中,一些低级编程往往围绕文件描述符展开。1、文件描述符的概念 在Linux系统中,一切都被视为一个文件。当进程打开现有文件或创建新文件时,内核会向进程返回一个文件描述符。文件描述符是进行高效管理的内核。打开的文件创建的索引用于指向打开的文件。所有执行I/O操作的系统调用都会通过文件描述符。二、文件描述符、文件、进程的关系1、说明:每个文件描述符对应一个打开的文件。不同的文件描述符也可能指向同一个文件。同一个文件可以被不同的进程打开。也可以在同一个进程中多次打开2.为了维护文件描述符,系统建立了三张表:进程级文件描述符表系统级文件描述符表文件系统i节点表(转:阮Yifeng——了解inode)3.通过这三张表,认识文件描述符在进程A中,文件描述符1和30都指向同一个打开的文件句柄(#23),可能是进程多次都是文件描述符2进程A中的文件描述符2和进程B中的文件描述符2指向同一个打开文件句柄(#73),用于执行打开操作。这种情况有几种可能性。1、进程A和进程B可能是父子进程关系;2、进程A和进程B打开同一个文件,文件描述符相同(小概率事件=_=);3.A和B中的一个进程通过一个UNIX域套接字打开一个文件将文件描述符传递给另一个进程。进程A的描述符0和进程B的描述符3指向不同的打开文件句柄,但这些句柄都指向i节点表的同一个条目(#1936),换句话说,指向同一个文件。发生这种情况是因为每个进程都对同一文件发出自己的打开请求。当同一个进程打开同一个文件两次时,也会出现类似的情况。前辈的思路,我们的阶梯,这部分参考自网络:链接3,文件描述符限制 有资源的地方,就有战争。需要一个“文件描述符”来执行改变世界的宏伟计划。世界需要秩序,所以有了“文件描述符限制”的规定。下表:永久修改用户级别限制时的设置分为三种:soft指当前系统有效的设置值hard指系统可设置的最大值-指软硬同时设置命令说明:ulimitsysctl4.查看某个进程的文件描述符相关内容的步骤(以nginx为例,*注意权限问题,本例为本地环境):找到需要查看的进程id如图,查到的进程id为1367查看进程的限制如图。在Maxopenfiles这一行可以看到当前设置的最大文件描述符数为1024,查看进程占用了多少文件描述符。如图所示,使用了17个文件描述符。总结 在实际的应用过程中,如果出现“Toomanyopenfiles”,可以通过增加进程可用的文件描述符的数量来解决,但往往故事并不是这样结束的。很多时候,并不是因为进程可用的文件描述符太少,而是因为程序bug,打开了大量的文件连接(web连接也占用文件描述符)没有释放。解决“Toomanyopenfiles”的根本方法是在程序请求的资源用完后及时释放。
