几百次打开后,fopen()是否有效?

时间:2010-08-23 16:35:03

标签: c++ fopen

嘿,对于这段代码,编写系统的人使用文本文件在进程之间传递数据。我有一个看起来像所有意图和目的的循环:

while (true)
{
 //get the most up-to-date info from the other processes
 pFile = fopen(paramsFileName, "r");

 // Do a bunch of stuff with pFile

 Sleep(100);
}

这将工作几百次,但无论出于何种原因,它会在一段时间后返回NULL,即使它已经打开了相同的文件路径数百次!我已经仔细检查过该文件是否存在并且当fopen返回NULL时其中包含数据,并且试图在其中放置延迟/重试无效。

您能想到什么会导致这种情况?

5 个答案:

答案 0 :(得分:14)

您正在达到操作系统的打开文件/文件描述符限制。如果你在循环中执行fclose(pFile),它应该永远运行。

答案 1 :(得分:5)

您真的想查看退货代码。我怀疑使用正确的errno的perror / strerror会报告你已经过了文件描述符限制。

尝试这样的事情,看看你是否收到了错误信息。

FILE* f = fopen(filename);
if (NULL == f) {
    fprintf(stderr, 
            "Could not open: %s. %s\n", 
            filename, 
            strerror(errno);
}

答案 2 :(得分:2)

你为什么这样做?处理这个问题的两种方法

while (true)
{
 //get the most up-to-date info from the other processes
 pFile = fopen(paramsFileName, "r");

 // Do a bunch of stuff with pFile

 fclose(pFile);

 //
 Sleep(100);
}

fopen调用移至循环外部

//get the most up-to-date info from the other processes
    pFile = fopen(paramsFileName, "r");
    while (true)
    {
     // Do a bunch of stuff with pFile

     Sleep(100);
    }
    fclose(pFile);

通过在您的情况下不断调用fopen来达到操作系统对打开文件数量的限制并不奇怪......

答案 3 :(得分:0)

尝试计算文件在失败前打开的次数。

同样,操作系统可能会打开扫描文件,这会阻止fopen函数,返回null,因为它在打开文件时失败了。

答案 4 :(得分:0)

我猜测在该循环中启动了一个线程,并且pFile被发送到该线程,将其留给该线程来关闭该文件。

不是编码的最佳方式,如果可以,请考虑将pFile包装在智能/共享指针中,当引用计数降至零时调用fclose(如果您不熟悉,请查看该设计模式)它)。

简单地说,你需要确保谁甚至得到指向pFile的指针调用fclose(不要从主线程调用fclose,如果另一个线程需要处理它)。

希望这会有所帮助。

btw,FILE 中的''告诉我这是c ++代码(java的类型旁边没有'*')。