Domanda

Ho un'applicazione multithread in esecuzione su Windows XP. A un certo punto una delle filato è non avendo aprire un file esistente utilizzando funzione fopen. _get_errno funzione restituisce EMFILE quali mezzi Troppi file aperti. Nessun altro descrittori di file sono disponibili . FOPEN_MAX per la mia piattaforma è 20. rendimenti _getmaxstdio 512. Ho controllato questo con WinDbg e vedo che circa 100 file sono aperti:

788 Handles
Type            Count
Event           201
Section         12
File            101
Port            3
Directory       3
Mutant          32
WindowStation   2
Semaphore       351
Key             12
Thread          63
Desktop         1
IoCompletion    6
KeyedEvent      1

Qual è la ragione che fopen fallisce?


EDIT:

Ho scritto semplice applicazione singola prova filettato. Questa applicazione può aprire 510 file. Non capisco il motivo per cui questa applicazione in grado di aprire più file quindi applicazione multithread. Può essere causa di perdite di handle di file?

#include <cstdio> 
#include <cassert> 
#include <cerrno> 
void main() 
{ 
    int counter(0); 

    while (true) 
    { 
        char buffer[256] = {0}; 
        sprintf(buffer, "C:\\temp\\abc\\abc%d.txt", counter++); 
        FILE* hFile = fopen(buffer, "wb+"); 
        if (0 == hFile) 
        { 
            // check error code 
            int err(0); 
            errno_t ret = _get_errno(&err); 
            assert(0 == ret); 
            int maxAllowed = _getmaxstdio(); 
            assert(hFile); 
        } 
    } 
}
È stato utile?

Soluzione

Credo che in Win32 tutte le funzioni CRT sarà finalmente endup utilizzando il sottostante API Win32. Quindi in questo caso molto probabilmente si deve utilizzare CreateFile / OpenFile di win32. Ora CreatFile / OpenFile api non è pensato solo per i file (file, directory, porte di comunicazione, tubi, slot di posta, volumi di disco, ecc,). Quindi, in una vera e propria applicazione a seconda del numero di queste risorse il file max aperti possono variare. Dal momento che non hai descritto molto circa l'applicazione. Questa è la mia prima congettura. Se il tempo lo permette passa attraverso questo http: // blog. technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx

Altri suggerimenti

Credo che questa è una limitazione del sistema operativo. Può dipendere da molte cose:. Il modo in cui i descrittori di file sono rappresentati, la memoria che consumano, e così via

E suppongo che non c'è molto che si può fare al riguardo. Forse c'è qualche parametro da modificare tale limite.

La vera domanda è, non si ha realmente bisogno di aprire i file che tanto allo stesso tempo? Voglio dire, anche se si dispone di più di 100 le discussioni cercando di leggere più di 100 file diversi, che probabilmente non sarà in grado di leggerli, allo stesso tempo, e non probabilmente otterrete alcun risultato meglio che avere, ad esempio, 50 thread .

E 'difficile essere più precisi dal momento che non sappiamo cosa si prova a realizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top