2010-08-23 10 views
7

Ehi, per questo pezzo di codice, la persona che ha scritto il sistema comunica i dati tra processi utilizzando file di testo. Ho un loop che sembra (per tutti gli effetti) come questo:Esiste un motivo per cui fopen() non funzionerebbe dopo diverse centinaia di aperture?

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

Questo lavoro per diverse centinaia di volte, ma per qualsiasi motivo verrà restituito NULL dopo un po ', anche se ha aperto lo stesso file percorso già centinaia di volte! Ho ricontrollato che il file esiste e contiene i dati al suo interno quando il fopen restituisce NULL e ha tentato di inserire un ritardo/riprovare lì senza alcun effetto.

Cosa puoi pensare che ciò potrebbe causare questo?

+0

La maggior parte dei sistemi operativi ha un limite al numero di file che possono essere aperti contemporaneamente. Su quale sistema operativo funziona? –

+1

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

+2

Windows 7. Provare ora per vedere se fclose() risolve il mio problema. Odio sistemare il codice di altre persone ..... – Paul

risposta

13

Stai colpendo il limite di descrittore di file/file aperti per il tuo sistema operativo. Dovrebbe funzionare per sempre se fai fclose (pFile) nel tuo ciclo.

+0

fclose() non sembra liberarsi del problema: < – Paul

+3

dove stai mettendo il fclose? Si prega di mostrare più codice. E hai contato il numero di volte in cui hai avuto successo prima del fallimento? Se quel numero è coerente, è molto probabilmente il limite del descrittore di file. –

+0

HMM sembrerebbe che io sia un pazzo e non sono riuscito a fclose() ogni volta che ho lasciato la funzione, e non alla fine. Questo l'ha risolto! – Paul

0

Provare a contare quante volte il file è stato aperto prima che abbia esito negativo.

Inoltre, è possibile che il sistema operativo stia aprendo il file per una scansione, che blocca la funzione fopen, restituendo null, poiché non ha avuto successo nell'apertura del file.

+0

Ho pensato che potrebbe essere che (o un altro processo di scrittura ad esso), ma mettendo in un po '(pFile == NULL) {sonno (100); pFile = fopen (..); } non lo ha risolto. – Paul

+0

Perché non provare: pFile = null; while (pFile == null) { pFile = fopen (paramsFileName, "r"); } – VerticalEvent

+0

è lo stesso effetto, il sonno era solo lì per ritardare e dare agli altri processi il tempo di finire. indipendentemente dal lavoro. – Paul

2

Perché stai facendo in questo modo? Due modi per affrontare questo

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

o Spostare la chiamata fopen al di fuori del ciclo

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

Non sorprende che si colpisce il limite della sistema operativo sul numero di file aperti chiamando costantemente fopen nel tuo caso ...

+0

Non riesco a rielaborare il modo in cui il sistema condivide le informazioni, quindi devo aprire il file passato per ottenere informazioni aggiornate su ciò che il sistema sta facendo. So che è un modo terribile/lento per farlo, ma non posso riscriverlo. – Paul

5

Vuoi veramente controllare i codici di ritorno. Ho il sospetto che perror/strerror con l'errore corretto indichi che hai esaurito il limite del descrittore di file.

Provare qualcosa del genere e vedere se si ottiene un messaggio di errore.

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

È quel codice PHP? –

+1

@Lasse: la domanda originale mostrava il codice C; la domanda è contrassegnata come C++ e questa risposta mostra il codice C. Da dove viene PHP? –

+0

Grazie per il codice di errore stampa! Mi ha davvero aiutato! – Paul

0

sto cercando di indovinare un filo viene avviato in quel ciclo, e il pFile viene inviato a quel filo, lasciando a quel filo per chiudere il file.

non

il modo migliore per il codice, e se è possibile, guardare in avvolgendo il pFile in un puntatore intelligente/condiviso, che chiamerà fclose, quando il conteggio di riferimento scende a zero (guardare in alto che modello di progettazione, se non si ha familiarità con esso).

In poche parole, è necessario assicurarsi che chi ottiene anche il puntatore del pFile chiama fclose su di esso (non chiamare fclose su di esso dal thread principale, se un altro thread deve lavorarci sopra).

spero che questo aiuti.

btw, '' nel FILE, mi dice che questo è codice C++ (java non ha un '*' accanto ai suoi tipi).

Problemi correlati