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) 加载的动态链接库和当前工作目录可以算作打开文件描述符吗? 在Linux下用C实现所有打开的文件描述符
最佳答案
如何计算取决于您感兴趣的信息。
浏览/proc/PID/fd/*
将为您提供打开的文件描述符的数量。但是,需要注意的是,两个进程实际上可能共享一个文件描述符,如果您 fork ,则子进程将从其父进程继承文件描述符,然后此方法将对其计数两次,每个进程一次。
/proc/PID/maps
将向您显示进程的内存映射,其中可以包括加载的可执行文件本身和动态链接库,但也包括与文件不对应的内容,例如堆、堆栈、vdso
节是内核导出的虚拟共享对象,等等。
lsof
将列出文件的各种使用方式,其中不仅仅包括文件描述符;它还包括可执行文件和共享库,但不包括与 /proc/PID/maps
中显示的文件不对应的内存区域。像堆栈,堆,vdso
部分等
/proc/sys/fs/file-nr
将报告打开的内核文件句柄的数量。内核文件句柄与文件描述符不同;可以有多个打开的文件描述符指向同一文件句柄,例如,通过调用 dup
或dup2
.
这些差异解释了为什么您通过这些不同的计数方式得到不同的数字。问题是,您使用此计数的目的是什么?这将有助于回答您实际应该使用哪种计数方式。
关于Linux 实现打开文件描述符 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922732/