C打开文件:打开文件的数量

时间:2012-10-10 16:54:20

标签: c iostream yacc lex

全部,

是否有任何解决方案可以在我的程序中获取已打开文件的数量

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

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

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

寻求帮助

2 个答案:

答案 0 :(得分:1)

如果您只使用 <{em> 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)

当然,这样的代码段只会影响您可以控制的代码:在调用#includefopen之前,它必须是fclose d - 否则,将调用原始函数而不是替换。

当涉及到将返回当前打开文件描述符数量的系统函数时,遗憾的是我不知道这样的事情。但是什么阻止您在调试器下运行应用程序,在fopen上设置断点,并且只是使用操作系统工具来检查该号码?在Linux上,进程中打开文件描述符的数量等于目录/proc/$PID/fd中的条目数 - 通过这种方式,您甚至可以知道将哪个实际文件分配给哪个文件描述符。 / p>

答案 1 :(得分: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