2010-08-23 15 views
7

Oye, para este fragmento de código, la persona que escribió el sistema comunica datos entre procesos usando archivos de texto. Tengo unos bucles que se ve (para todos los efectos) como este:¿Existe alguna razón por la cual fopen() no funcione después de varios cientos de aperturas?

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

Esto funciona para varios cientos de veces, pero por alguna razón se devolverá NULL después de un tiempo, a pesar de que se ha abierto el mismo ruta de archivo varias cientos de veces ya! He comprobado dos veces que el archivo existe y tengo datos cuando el fopen devuelve NULL, y he intentado poner un retraso/reintento allí sin ningún efecto.

¿Qué se puede pensar en que podría causar esto?

+0

La mayoría de los sistemas operativos tienen un límite en la cantidad de archivos que se pueden abrir a la vez. ¿En qué sistema operativo se está ejecutando? –

+1

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

+2

Windows 7. Probar ahora para ver si el archivo fclose() resuelve mi problema. Odio arreglar el código de otras personas ... – Paul

Respuesta

13

que está golpeando el límite de descriptor de archivos/archivo abierto para su sistema operativo. Debería ejecutarse siempre si hace fclose (pFile) en su ciclo.

+0

fclose() parece que no se deshace del problema: < – Paul

+3

¿dónde está poniendo el fclose? Por favor, muestre más código. ¿Y has contado la cantidad de veces que tienes éxito antes del fracaso? Si ese número es constante, lo más probable es que sea el límite del descriptor de archivo. –

+0

HMM parece que soy un tonto y no puedo cerrar() cada vez que dejo la función, y no al final. ¡Esto lo solucionó! – Paul

0

trate de hacer un recuento de las veces que se ha abierto el archivo antes de que falle.

Además, es posible que el sistema operativo se está abriendo el archivo de una exploración, que bloquea la función fopen, volviendo nula, ya que no tuvo éxito en la apertura del archivo.

+0

Pensé que podría ser eso (u otro proceso de escritura), pero poner en un tiempo (pFile == NULL) {sleep (100); pFile = fopen (..); } no lo resolvió – Paul

+0

Por qué no intentarlo: pFile = null; while (pFile == null) { pFile = fopen (paramsFileName, "r"); } – VerticalEvent

+0

es con el mismo efecto, el sueño solo estaba allí para retrasar y dar tiempo a otros procesos para terminar. independientemente de que no trabaje. – Paul

2

¿Por qué lo haces de esa manera? Dos maneras de hacer frente a este

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 Mover la llamada fopen a fuera del bucle

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

No es de extrañar que se golpea el límite del sistema operativo en el número de archivos abiertos constantemente llamando fopen en su caso ...

+0

No puedo volver a trabajar la forma en que el sistema comparte información, por lo que debo abrir el archivo pasado para obtener información actualizada sobre lo que está haciendo el sistema. Sé que es una forma terrible/lenta de hacerlo, pero no puedo reescribirlo. – Paul

5

que realmente quiere revisar sus códigos de retorno. Sospecho que perror/strerror con el error correcto informará que ha agotado su límite de descriptor de archivo.

intentar algo como esto y ver si le da un buen mensaje de error.

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

¿Es ese código PHP? –

+1

@Lasse: la pregunta original mostraba el código C; la pregunta está etiquetada como C++ y esta respuesta muestra el código C. ¿De dónde vino PHP? –

+0

¡Gracias por el código de error de impresión! ¡Realmente ayudó! – Paul

0

supongo un hilo se inicia en ese bucle, y el pFile se envía a ese hilo, dejando a ese hilo para cerrar el archivo.

no es la mejor manera de codificar, y si puede, busque envolver el pFile en un puntero inteligente/compartido, que llamará a fclose, cuando el recuento de referencia se reduzca a cero (busque ese patrón de diseño si no está familiarizado con eso).

En pocas palabras, debe asegurarse de que incluso el puntero de las llamadas a pFile se cierre (no llame a fclose desde el hilo principal, si otro hilo debe estar trabajando en ello).

Espero que esto ayude.

por cierto, el '' en el ARCHIVO, me dice que este es el código de C++ (java no tiene un '*' al lado de sus tipos).

Cuestiones relacionadas