2010-08-23 7 views
7

Hey, für dieses Stück Code, kommuniziert die Person, die das System schrieb Daten zwischen Prozessen mit Textdateien. Ich habe ein Schleifen, die (für alle Absichten und Zwecke) wie folgt aussieht:Gibt es einen Grund, warum fopen() nach mehreren hundert Öffnen nicht funktioniert?

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); 
} 

für mehrere hundert Mal Dies funktioniert, aber aus irgendeinem Grund wird es geben NULL zurück, nach einer Weile, obwohl es das gleiche eröffnet Dateipfad schon mehrere hundert Mal! Ich habe doppelt überprüft, dass die Datei existiert und Daten enthält, wenn die fopen NULL zurückgibt, und habe versucht, eine Verzögerung/Wiederholung dort ohne Wirkung zu setzen.

Was können Sie denken, dass dies verursachen würde?

+0

In den meisten Betriebssystemen ist die Anzahl der Dateien begrenzt, die gleichzeitig geöffnet werden können. Auf welchem ​​Betriebssystem läuft das? –

+1

http://www.word-detective.com/2009/01/16/intensive-purposees/ –

+2

Windows 7. Jetzt testen, um zu sehen, ob die fclose() mein Problem löst. Ich hasse es, den Code anderer Leute zu reparieren ... – Paul

Antwort

13

Sie treffen die Grenze für offene Datei-/Dateibeschreibungen für Ihr Betriebssystem. Es sollte für immer laufen, wenn Sie (pFile) in Ihrer Schleife schließen.

+0

fclose() scheint das Problem nicht loszuwerden: < – Paul

+3

wo setzen Sie den fclose? Bitte zeigen Sie mehr Code an. Und haben Sie gezählt, wie oft Sie vor dem Scheitern Erfolg haben? Wenn diese Zahl konsistent ist, ist es höchstwahrscheinlich das Limit für den Dateideskriptor. –

+0

HMM es würde scheinen, dass ich ein Idiot bin und fclose() fehlschlug, wenn ich die Funktion verlasse, und nicht am Ende davon. Das hat es behoben! – Paul

0

Versuchen Sie, zu zählen, wie oft die Datei geöffnet wurde, bevor sie fehlschlägt.

Es ist auch möglich, dass das Betriebssystem die Datei für einen Scan öffnet, der die fopen-Funktion blockiert und null zurückgibt, da das Öffnen der Datei nicht erfolgreich war.

+0

Ich dachte, es könnte sein, dass (oder ein anderer Prozess zu schreiben), aber eine Weile (pFile == NULL) {Schlaf (100); pFile = fopen (..); } hat es nicht gelöst. – Paul

+0

Warum nicht versuchen: pFile = null; while (pFile == null) { pFile = fopen (paramsFileName, "r"); } – VerticalEvent

+0

es ist in der gleichen Wirkung, der Schlaf war nur da, um zu verzögern und andere Prozesse Zeit zu beenden. egal wie arbeiten. – Paul

2

Warum machst du es so? Zwei Möglichkeiten, um mit diesem

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); 
} 

oder Bewegen Sie den fopen Anruf außerhalb der Schleife

//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); 

Nicht überraschend, dass Sie das Betriebssystem des Begrenzung für die Anzahl der Dateien getroffen offen durch ständig fopen Aufruf in Ihrem Fall ...

+0

Ich kann die Art, wie das System Informationen teilt, nicht nachbearbeiten, daher muss ich die übergebene Datei öffnen, um aktualisierte Informationen darüber zu erhalten, was das System macht. Ich weiß, es ist eine schreckliche/langsame Art, es zu tun, aber ich kann es nicht umschreiben. – Paul

5

Sie möchten wirklich Ihre Rückkehrcodes überprüfen. Ich vermute, dass perror/strerror mit dem richtigen errno melden würde, dass Sie Ihr Dateideskriptorlimit überschritten haben.

Versuchen Sie so etwas und sehen Sie, ob Sie eine gute Fehlermeldung erhalten.

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

Ist das PHP-Code? –

+1

@Lasse: Die ursprüngliche Frage zeigte C-Code; Die Frage wird als C++ markiert und diese Antwort zeigt C-Code. Woher kam PHP? –

+0

Danke für den Fehlercode! Es hat wirklich geholfen! – Paul

0

ich einen Thread zu erraten ist in dieser Schleife gestartet, und die pFile an diesem Thread gesendet, es bis zu diesem Thread verlassen die Datei zu schließen.

nicht der beste Weg, um zu programmieren, und wenn Sie können, in die Verpackung der pFile in einem Smart/Shared-Zeiger, der fclose, wenn der Verweis Zähler fällt auf Null (schauen Sie sich das Design-Muster, wenn Sie nicht vertraut sind damit).

einfach gesagt, müssen Sie sicherstellen, wer sogar den Zeiger auf die pFile-Aufrufe fclose darauf (nicht fclose darauf aus dem Haupt-Thread, wenn ein anderer Thread muss daran arbeiten).

hoffe das hilft.

BTW, die '' in der Datei, sagt mir, das ist C++ - Code (Java hat kein '*' neben seinen Typen).