2009-08-22 10 views
10

¿Cómo puedo encontrar todos los archivos abiertos en un proceso (desde adentro)?Cerrar todos los archivos abiertos en un proceso

Esto parece útil saber después de fork() (antes exec()).

sé de la existencia de getdtablesize() y el más portátil sysconf(_SC_OPEN_MAX), pero parece ineficaz para intentar cerrar cada descriptor de archivo válido , si hay un archivo abierto detrás de él o no. (También soy consciente de los peligros de la optimización prematura, esto es más acerca de la estética, supongo :-)

Respuesta

3

Puede parecer ineficaz para intentar cerrar todos los descriptores de archivos, pero en realidad no es tan malo. La implementación de llamada al sistema para buscar un descriptor de archivo debería ser bastante eficiente si el sistema es bueno.

Si solo desea buscar los descriptores de archivos abiertos, puede usar el sistema de archivos proc en los sistemas donde exista. P.ej. en Linux,/proc/self/fd mostrará una lista de todos los descriptores de archivos abiertos. Itere sobre ese directorio y cierre todo> 2, excluyendo el descriptor de archivo que denota el directorio sobre el que está iterando.

8

Si el programa se llama fork y exec, que realmente debe abrir todos los descriptores de fichero con la bandera O_CLOEXEC por lo que no tiene que cerrar manualmente antes de exec. También puede usar fcntl para agregar esta bandera después de abrir un archivo, pero eso está sujeto a las condiciones de carrera en programas multiproceso.

+0

Bienvenido a las carreras. – ybungalobill

Cuestiones relacionadas