1

全て、

私のプログラムで開いているファイルの数を取得する解決策はありますか?

問題は次のとおりです。lexとyaccを使用したファイルのリストの解析中

yyin は現在のストリームの fopen を受け取り、最後 (yywrap) で fclose を使用して yyin を閉じます。したがって、通常、開かれたファイルの数はゼロに等しくなります。いくつかの例では、fopen(多くの opned ファイル) を呼び出すと、このエラー例外が発生します。

私の質問は、この問題をデバッグするために、システムコマンドからオープンファイルの数を取得する方法です。

助けてくれてありがとう

4

2 に答える 2

1

andのみ を使用する場合、探しているもの (私が思うに) は、次のようなトリックで達成される可能性があります。fopenfclose

#include <stdio.h>

unsigned int open_files = 0;

FILE *fopen_counting(const char *path, const char *mode)
{
    FILE *v;
    if((v = fopen(path,mode)) != NULL) ++open_files;
    return v;
}

int fclose_counting(FILE *fp)
{
    int v;
    if((v = fclose(fp)) != EOF) --open_files;
    return v;
}

#define fopen(x,y) fopen_counting(x,y)
#define fclose(x) fclose_counting(x)

もちろん、このようなスニペットは、あなたが制御できるコードにのみ影響します: への呼び出しや#include実行の前に d を実行する必要があります。そうしないと、置換の代わりに元の関数が呼び出されます。fopenfclose

開いているファイル記述子の現在の数を返すシステム関数に関しては、残念ながらそのようなことは知りません。しかし、アプリケーションをデバッガーで実行し、ブレークポイントを設定しfopen、単に OS ツールを使用してその数値を確認することを妨げているのは何ですか? Linux では、プロセスで開いているファイル記述子の数は、ディレクトリ内のエントリの数と同じ/proc/$PID/fdです。このようにすることで、実際のファイルがどのファイル記述子に割り当てられているかがわかります。

于 2012-10-10T17:53:23.120 に答える
0

整数を使用して、 と等しく設定し、使用する0たびに増加させ、使用するfopenたびに減少させることができますfclose

file *fp;                  
int files_opened = 0;      //number of open files

if(!(fp = fopen("file.txt", "r"))) //open file
{
                           //could not open file
}
else files_opened++;       //we opened a file so increment files_opened
printf("\n%d files are currently open.", files_opened); //display how many files currently open
if(!(fclose(fp) != EOF)))  //close file
{
    //could not close file
}
else files_opened--;       //we closed a file so decrement files_opened
printf("\n%d files are currently open.", files_opened); //display how many files currently open
于 2012-10-10T16:56:10.407 に答える