Есть ли причина, по которой fopen () не будет работать после нескольких сотен открытий?

Hey, для этого фрагмента кода человек, который написал систему, передает данные между процессами, используя текстовые файлы. У меня есть циклы, которые выглядят (для всех намерений и целей) так:

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, и попытался ввести задержку / повторную попытку там безрезультатно.

Что вы думаете о том, что могло бы вызвать это?

8
задан Paul 23 August 2010 в 17:13
поделиться

4 ответа

Вы превысили лимит открытых файлов/файловых дескрипторов для вашей ОС. Он должен работать вечно, если вы выполняете fclose(pFile) в своем цикле.

14
ответ дан 5 December 2019 в 07:56
поделиться

Попробуйте подсчитать, сколько раз файл открывался до того, как произошел сбой.

Также возможно, что ОС открывает файл для сканирования, что блокирует функцию fopen, возвращая значение null, поскольку открыть файл не удалось.

0
ответ дан 5 December 2019 в 07:56
поделиться

Почему вы так делаете? Два способа справиться с этим

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 в вашем случае ...

2
ответ дан 5 December 2019 в 07:56
поделиться

Вы действительно хотите проверить свои коды возврата. Я подозреваю, что perror/strerror с правильным errno сообщит, что вы исчерпали лимит файлового дескриптора.

Попробуйте что-нибудь подобное и посмотрите, появится ли у вас правильное сообщение об ошибке.

FILE* f = fopen(filename);
if (NULL == f) {
    fprintf(stderr, 
            "Could not open: %s. %s\n", 
            filename, 
            strerror(errno);
}
5
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: