1)是否可以选择循环/proc
以获取打开文件描述符的总数?
我使用了以下目录:
/proc/PID/fd/*
/proc/PID/maps
/proc/PID/cwd
/proc/PID/root
/proc/PID/exe
2)该号码与lsof | wc -l
和cat /proc/sys/fs/file-nr
3)加载的动态链接库和当前工作目录可以算作开放文件描述符吗? 在C for Linux中实现所有打开的文件描述符
答案 0 :(得分:1)
1)不,但似乎你对于构成开放文件描述符的内容感到困惑,正如你的第二个问题所暗示的那样
2)看http://codingtragedy.blogspot.com/2015/04/nofile-ulimit-n-rlimitnofile-most.html - 虽然它解释了资源限制的处理,这似乎是无关紧要的,但它也解释了文件描述符和你最想要的“结构文件”之间的区别,它甚至涵盖了你的用法。
3)同样,目前还不清楚你的实际问题是什么。当前工作目录不是文件描述符,仅用inode表示。进程可能会或可能不会为链接库保留fd,但映射本身会占用“结构文件”。
答案 1 :(得分:1)
您如何计算这取决于您感兴趣的信息。
查看/proc/PID/fd/*
将为您提供打开文件描述符的数量。但是,需要注意的是,两个进程实际上可以共享一个文件描述符,如果你是fork,那么子进程从其父进程继承文件描述符,然后这个方法将对它进行两次计数,每个进程一次。
/proc/PID/maps
将显示进程的内存映射,其中可以包含已加载的可执行文件本身和动态链接库,但还包括与堆,堆栈,{等文件不对应的内容。 {1}}部分是内核导出的虚拟共享对象,依此类推。
vdso
将列出文件可以使用的各种方式,其中不仅包括文件描述符;它还包括可执行文件和共享库,但不包括与lsof
中显示的文件不对应的内存区域,如堆栈,堆,/proc/PID/maps
部分等。
vdso
将报告打开的内核文件句柄的数量。内核文件句柄与文件描述符不同;可以打开多个指向同一文件句柄的文件描述符,例如,通过调用/proc/sys/fs/file-nr
或dup
。
这些差异解释了为什么你从这些不同的计算方法中得到不同的数字。问题是,您使用此计数的目的是什么?这将有助于回答您应该实际使用的计数方式。