Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找当前打开的文件句柄数(非lsof)_C++_C_Linux_Unix_Setrlimit - Fatal编程技术网

C++ 查找当前打开的文件句柄数(非lsof)

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

在*NIX系统上,有没有办法确定当前正在运行的进程中有多少个打开的文件句柄

我正在寻找一个API或一个用于C的公式,从正在运行的进程中寻找。

在某些系统上(见下文),您可以在/proc/[pid]/fd中计算它们。如果不在其中一个上,请参阅以下内容:

在c中,您可以列出目录并计算总数,或列出目录内容:

 #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);