C ++程序中打开文件的数量

时间:2013-06-13 13:23:20

标签: c++ file fopen

是否有一种简单的方法来获取c ++程序打开的文件数。

我想从我的代码中完成,最好是在C ++中。

我发现this blog article正在使用循环遍历所有可用的文件描述符并测试fstat的结果,但我想知道是否有更简单的方法可以做到这一点。



修改

似乎除了保持打开文件的数量之外没有其他解决方案。感谢大家的帮助。

凯文

5 个答案:

答案 0 :(得分:1)

由于文件是FILE *,我们可以这样做:

在随处可见的头文件中:

#define fopen(x, y) debug_fopen(x, y, __FILE__, __LINE__)
#define fclose(x)   debug_fclose(x)
“debugfile.cpp”中的

(显然不能使用上面的#define

struct FileInfo
{
   FileInfo(const char *nm, const char fl, int ln) :  
      name(nm), file(fl), line(ln) {}

   std::string name;
   const char *file;
   int line;
};

std::map<FILE*, FileInfo> filemap;

FILE *debug_fopen(const char *fname, const char *mode, const char *file, int line)
{
   FILE *f = fopen(fname, mode);
   if (f)
   {
      FileInfo inf(fname, file, line);
      filemap[f] = inf;
   }
}

int debug_fclose(FILE *f)
{
   int res = fclose(f);
   filemap.erase(f);
   return res;
}

// Called at some points. 
void debug_list_openfiles()
{
   for( i : filemap )
   {
       cerr << "File" << (void *) i.first << " opened as " << i.second.name 
            << " at " <<  i.second.file << ":" << i.second.line << endl;
   }
}

(我还没有编译这个代码,它的意思是显示这个概念,它可能有一些小错误,但我认为这个概念会保留 - 只要你的代码,而不是某些第三方库泄漏)< / p>

答案 1 :(得分:0)

如果您使用的是Linux,则可以在/proc/you_pid/fd下找到此信息。

然后在每个文件描述符上使用lstat以仅保留常规文件。

答案 2 :(得分:0)

有一个很好的做法,即文件的范围尽可能小,打开转储所需的所有信息,或缓冲到fd,然后关闭。

所以这意味着通常的情况我们将有3 fd std in / out / err,加上所有打开的文件。

如果保持文件打开,

手动跟踪打开的文件是最好的。

放一个全局fdCounter变量, 成功打开文件后递增,递减后递减

答案 3 :(得分:0)

如果你正确封装它,添加引用计数器或记录到它并将它们打印到控制台应该很简单。

调试它的一种方法是用你自己的实现覆盖open调用,并从那里调用真实的东西。然后你也可以进行一些登录,看看你是否丢失了文件描述符。你怎么打开文件?使用open()或您使用fopen()

这样的事情可能是:

#include <fstream>
#include <iostream>
#include <stdlib.h>

#include <fcntl.h>

inline int log_open(char *p, int flags, int mode)
{
    int fd = ::open(p, flags, mode);
    std::cout << "OPEN: " << fd << std::endl;
    return fd;
}

inline int log_close(int fd)
{
    int rc = ::close(fd);
    std::cout << "CLOSE: " << fd << std::endl;
    return rc;
}

#define open(p, f, m)    log_open(p, f, m)
#define close(fd)   log_close(fd)

int main(int argc, char *argv[])
{
    int fd = open("tmp.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);

    std::cout << "FD: " <<  fd << std::endl;

    if(fd != -1)
        close(fd);

    return 0;
}

答案 4 :(得分:0)

根据我的经验,当您需要计算文件描述符的数量时,您不知道它们被打开的位置,通过什么子模块或库。因此,包裹打开/关闭不是可行的策略。蛮力计数似乎是唯一的方法。

具有orig博客帖子的域名不再在DNS中解析。我从Find current number of open filehandle ( NOT lsof )

复制了两个提案
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);

还有这个:

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