1

全部,

有什么解决方案可以获取我的程序 c 中打开文件的数量

问题是:使用 lex 和 yacc 解析文件列表时

yyin 收到当前流的 fopen,最后(yywrap)我使用 fclose 关闭 yyin:所以通常打开文件的数量等于零。对于某些示例,当我调用 fopen(许多打开的文件)时,我会收到此错误异常

所以我的问题是如何从系统命令中获取已打开文件的数量以调试此问题。

谢谢帮助

4

2 回答 2

1

如果您 fopen使用and fclose,那么您正在寻找的东西(我认为)可能会通过这样的技巧来实现:

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

当然,像这样的代码片段只会影响您可以控制的代码:它必须是d 在对或进行#include任何调用之前- 否则,将调用原始函数而不是您的替换。fopenfclose

当涉及到将返回当前打开文件描述符数量的系统函数时,不幸的是我不知道这样的事情。但是是什么阻止了您在调试器下运行应用程序、在 上设置断点fopen以及简单地使用操作系统工具检查该数字?在 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 回答