是否有一种简单的方法来获取c ++程序打开的文件数。
我想从我的代码中完成,最好是在C ++中。
我发现this blog article正在使用循环遍历所有可用的文件描述符并测试fstat
的结果,但我想知道是否有更简单的方法可以做到这一点。
似乎除了保持打开文件的数量之外没有其他解决方案。感谢大家的帮助。
凯文
答案 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;
}