2010-08-23 2 views
7

Эй, для этого фрагмента кода человек, который написал систему, передает данные между процессами с помощью текстовых файлов. У меня есть петли, который выглядит (для всех намерений и целей), как это:Есть ли причина, по которой 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, и попытался поместить в него задержку/повтор попыток.

Что вы можете подумать об этом?

+0

Большинство операционных систем имеют ограничение на количество файлов, которые можно открыть за один раз. Какая ОС работает? –

+1

http://www.word-detective.com/2009/01/16/intensive-purposes/ – 2010-08-23 16:40:58

+2

Windows 7. Тестирование теперь, чтобы проверить, разрешает ли fclose() мою проблему. Я ненавижу устанавливать чужие коды ..... – Paul

ответ

13

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

+0

fclose(), похоже, не устраняет проблему: < – Paul

+3

где вы помещаете fclose? Пожалуйста, покажите больше кода. И подсчитали ли вы количество попыток до неудачи? Если это число является согласованным, это, скорее всего, ограничение дескриптора файла. –

+0

HMM казалось бы, что я дурак и не смог fclose() всякий раз, когда я оставляю функцию, а не в конце ее. Это исправлено! – Paul

0

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

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

+0

Я думал, что это может быть (или другой процесс, написанный на нем), но вставляя время (pFile == NULL) {sleep (100); pFile = fopen (..); } не решила. – Paul

+0

Почему бы не попробовать: pFile = null; while (pFile == null) { pFile = fopen (paramsFileName, "r"); } – VerticalEvent

+0

Это то же самое, что спать было только там, чтобы задержать и дать другим процессам время до конца. независимо от того, работают ли они. – Paul

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

+0

Я не могу доработать то, как система делится информацией, поэтому я должен открыть переданный файл, чтобы получить обновленную информацию о том, что делает система. Я знаю, что это ужасный/медленный способ сделать это, но я не могу его переписать. – Paul

5

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

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

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

Является ли этот PHP-код? –

+1

@ Lasse: оригинальный вопрос показал C-код; вопрос помечен как C++, и этот ответ показывает C-код. Откуда появился PHP? –

+0

Спасибо за код ошибки! Это действительно помогло! – Paul

0

Я предполагаю, что нить запускаются в этом цикле, и Pfile отправляются в эту тему, оставляя его в эту тему, чтобы закрыть файл.

не лучший способ кодирования, и если можно, просмотрите упаковку pFile в интеллектуальном/совместно используемом указателе, который вызовет fclose, когда счетчик ссылок упадет до нуля (найдите этот шаблон дизайна, если вы незнакомы с этим).

Проще говоря, вы должны убедиться, что кто-то даже получает указатель на вызовы pFile fclose на нем (не называть fclose на нем из основного потока, если на него должен работать другой поток).

надеюсь, что это поможет.

btw, '' в ФАЙЛЕ, говорит мне, что это код C++ (у java нет '*' рядом с его типами).

Смежные вопросы