Heredé recientemente un código que alguien más había escrito.¿Cuáles son las implicaciones de no cerrar un identificador de directorio en Perl?
descubrí que todo el código que un directorio se abrió a la lectura, nunca fue cerrado debido a que el desarrollador original tenía un problema de sintaxis - que estaba usando la función close
para intentar cerrar un directorio manejar lugar de la función closedir
.
El código fue algo como esto:
opendir(DIR, $dir) or die "Cannot open $dir: $!\n";
@files = readdir(DIR);
close(DIR);
(que es otro buen punto de que se hace en Perl Best Practices (páginas 208,278) sobre la comprobación del retorno de la función close
Si el regreso de close
fuera. comprobado en este caso, estaría fallando con "Número de archivo incorrecto")
Desde entonces he cambiado esto a closedir
, pero me hizo comenzar a preguntarme: Dado que el identificador de directorio nunca se cerró, ¿cuáles son las implicaciones negativas mantener un identificador de directorio abierto por una larga duración?
Este programa es más grande (3.500 líneas de código), se ejecuta durante un tiempo (5-10 minutos) y varias instancias de este programa se ejecutan al mismo tiempo. En el caso de este directorio en el ejemplo anterior, $dir
es el mismo valor para todas las instancias. Si se ejecutaban 10 instancias de este programa al mismo tiempo, todas tenían un identificador de directorio abierto contra el mismo directorio durante 5 minutos o más. Estoy seguro de que Perl está cerrando automáticamente el identificador de directorio cuando finalice el programa, pero la mejor práctica dice que se cierre lo antes posible.
Me resulta más obvio que dejar los identificadores de archivo abiertos puede causar problemas (especialmente para los identificadores de archivo que están abiertos para escribir), pero ¿qué cosas malas pueden suceder al no cerrar un identificador de directorio?
La razón por la que estoy preguntando es porque ha habido una extraña circunstancia en la que este programa intentaba crear un archivo (en el directorio definido por $ dir anterior). El nombre de archivo tenía el PID incrustado en él, por lo que existe una menor probabilidad de que el archivo ya pudiera estar allí, pero Perl no pudo abrir el archivo para escribir, porque dijo que ya existía. Cuando miramos en el directorio, ese archivo no existía. Me pregunto si todos los manejadores de directorios abiertos en este directorio podrían causar tal problema.
No estoy seguro de si el sistema operativo hace la diferencia, pero este programa se ejecuta en AIX.
¡Gracias de antemano y feliz viernes!
Incluso hoy en día algunos sistemas operativos son bastante tacaños con los descriptores de archivos (estoy viendo * usted *, Solaris, y su configuración predeterminada de 64-256). – mob
@mobrule - Lo siento, no puedo publicar su comentario, debido a que no hay descriptores de archivos disponibles - Atentamente, StackOverflow Solaris Backend .... – DVK