C++ 查找当前打开的文件句柄数(非lsof)
在*NIX系统上,有没有办法确定当前正在运行的进程中有多少个打开的文件句柄 我正在寻找一个API或一个用于C的公式,从正在运行的进程中寻找。在某些系统上(见下文),您可以在/proc/[pid]/fd中计算它们。如果不在其中一个上,请参阅以下内容: 在c中,您可以列出目录并计算总数,或列出目录内容:C++ 查找当前打开的文件句柄数(非lsof),c++,c,linux,unix,setrlimit,C++,C,Linux,Unix,Setrlimit,在*NIX系统上,有没有办法确定当前正在运行的进程中有多少个打开的文件句柄 我正在寻找一个API或一个用于C的公式,从正在运行的进程中寻找。在某些系统上(见下文),您可以在/proc/[pid]/fd中计算它们。如果不在其中一个上,请参阅以下内容: 在c中,您可以列出目录并计算总数,或列出目录内容: #include <stdio.h> #include <sys/types.h> #include <dirent.h> int main (voi
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int
main (void)
{
DIR *dp;
struct dirent *ep;
dp = opendir ("/proc/MYPID/fd/");
if (dp != NULL)
{
while (ep = readdir (dp))
puts (ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
支持proc文件系统的操作系统包括但不限于
不限于:Solaris
虹膜
Tru64 UNIX
BSD
Linux(将其扩展到与进程无关的数据)
IBM AIX(其实现基于Linux以提高兼容性)
QNX
贝尔实验室的计划9
没有可移植的方法来获取开放描述符的数量(无论类型如何),除非您自己跟踪它们。在任何*nix系统上都可以使用的想法是:
int j, n = 0;
// count open file descriptors
for (j = 0; j < FDMAX; ++j) // FDMAX should be retrieved from process limits,
// but a constant value of >=4K should be
// adequate for most systems
{
int fd = dup (j);
if (fd < 0)
continue;
++n;
close (fd);
}
printf ("%d file descriptors open\n", n);
intj,n=0;
//计数打开的文件描述符
对于(j=0;j=4K的常量值
//适用于大多数系统
{
int fd=dup(j);
如果(fd<0)
继续;
++n;
关闭(fd);
}
printf(“%d个文件描述符打开\n”,n);
OpenSSH实现了一个功能,该功能与您需要的功能非常相似,将wallyk和chown已经提出的两种方法混合在一起,并且OpenSSH非常可移植,至少在Unix/Linux/BSD/Cygwin系统之间是如此。这对于例如FreeBSD系统来说是不可移植的,因为它们没有/proc/文件系统。另外:这并没有回答OP的问题。我喜欢wallyk的答案,它更便携,并且依赖于子系统提供的很少的设施。但是,在我的例子中,我需要确保计数文件句柄的尝试很有可能成功;i、 不必打开和关闭更多文件句柄。从这个意义上说,chown的解决方案更好,因为它只需要再使用一个文件句柄。@CodeMedic:wallyk解决方案在循环中打开和关闭文件时,在任何时候都只需要一个额外的文件处理程序。@salva尽管每个fd都必须复制,这可能是好的,但对于插座或跨挂载打开fd之类的事情,可能会减慢速度(没有什么可以支持这一说法,只是似乎有合理的可能性)。。该方法还必须执行3.9k额外的循环运行(这是可以忽略的,因为当dup失败时,它们只是继续运行)。但对于非/proc文件系统来说,这似乎是最好的选择。这种方法虽然残酷,但非常有趣。它不能区分“真实”文件和其他字符设备,如终端和插座。@arne:OP不要求区分。只有打开文件句柄的总数。这肯定是真的,但万一他忘了,我提到了它。我喜欢它的简单性;但就我而言,我更喜欢chown的解决方案。请参阅我对chown答案的评论,以了解原因。您可以致电fstat并检查EBADF,而不是Dupping(使用另一个fd)。
int j, n = 0;
// count open file descriptors
for (j = 0; j < FDMAX; ++j) // FDMAX should be retrieved from process limits,
// but a constant value of >=4K should be
// adequate for most systems
{
int fd = dup (j);
if (fd < 0)
continue;
++n;
close (fd);
}
printf ("%d file descriptors open\n", n);