C++ プログラムによって開かれたファイルの数を取得する簡単な方法はありますか。
コードから、理想的には C++ で実行したいと思います。
利用可能なすべてのファイル記述子をループして結果をテストしているこのブログ記事を見つけましたfstat
が、それを行う簡単な方法があるかどうか疑問に思っています。
編集
開いているファイルの数を維持する以外に解決策はないようです。助けてくれてありがとう。
ケビン
ファイルは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;
}
}
(私はこのコードをコンパイルしていません。コンセプトを示すためのものです。小さなバグがあるかもしれませんが、サードパーティのライブラリがリークしていない限り、コンセプトは保持されると思います)
Linux を使用している場合、この情報は にあります/proc/you_pid/fd
。
次に、lstat
各ファイル記述子で、通常のファイルのみを保持するために使用します。
ファイルのスコープを可能な限り小さく開いて、必要なすべての情報をダンプして開くか、fd にバッファリングしてから閉じることをお勧めします。
したがって、これは通常の場合、std in/out/err に加えて、開いているすべてのファイルに 3 つの fd があることを意味します。
ファイルを開いたままにする場合は、開いているファイルを手動で追跡するのが最善です。
グローバルな fdCounter 変数を設定し、ファイルが正常に開かれた後にインクリメントし、閉じた後にデクリメントされます
適切にカプセル化した場合、参照カウンターまたはログを追加してコンソールに出力するのは簡単です。
それをデバッグする 1 つの方法は、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;
}