2012-05-20 12 views
5

¿Hay alguna forma en Linux (o más generalmente en un sistema operativo POSIX) que garantice que durante la ejecución de un programa no se reutilizarán los descriptores de archivo, incluso si un archivo se cierra y se abre otro? Tengo entendido que esta situación generalmente llevaría a que el descriptor de archivo para el archivo cerrado se reasigne al archivo recién abierto.Evitando la reutilización de descriptores de archivos

Estoy trabajando en un proyecto de seguimiento de E/S y haría la vida más fácil si pudiera asumir que después de una llamada open()/fopen(), todas las E/S posteriores a ese descriptor de archivo son iguales archivo.

Tomaré una solución en tiempo de compilación o en tiempo de ejecución.

Si no es posible, podría hacer mi propia contabilidad cuando procese el archivo de rastreo (teniendo en cuenta la ubicación de todas las llamadas de abrir y cerrar), pero preferiría eliminar el problema durante la ejecución del programa rastreado.

+0

Creo que debería tomar el segundo enfoque (hacer su propia contabilidad). Cambiar el comportamiento de la asignación del descriptor de archivo (estrictamente especificado por POSIX) a algo no conforme romperá los programas de maneras sutiles (y posiblemente peligrosas). –

Respuesta

7

Tenga en cuenta que POSIX requires:

La función abierta() devolverán un descriptor de archivo para el archivo llamado que no es el descriptor más bajo archivo abierto para ese proceso .

En el sentido estricto, su solicitud cambiará el entorno del programa para que ya no sea compatible con POSIX.

Dicho esto, creo que su mejor opción es usar el LD_PRELOAD trick para interceptar llamadas al close e ignórelas.

+0

Gracias, es bueno encontrar la confirmación en la especificación POSIX para el comportamiento que he estado observando. – mhowison

1

Debería escribir un SO que contenga un close(2) que abra /dev/null en FDs antiguos, y luego use $LD_PRELOAD para cargarlo en el espacio de proceso antes de iniciar la aplicación.

+0

En realidad, ya tengo una llamada a __wrap_close() para implementar las rutinas de seguimiento, así que parece que podría insertar el abierto ("/ dev/null") dentro de esa rutina después de llamar a __real_close() en el FD. ¿Esto siempre funcionará? Es decir. ¿Tengo la garantía de recuperar el mismo FD en la llamada abierta ("/ dev/null") cuando cerré con la llamada __real_close()? – mhowison

+1

No. Por eso abre una vez y usa 'dup2 (2)' para copiar el FD. –

+0

'__wrap_close' es * en ninguna parte * lo suficientemente cerca como para fines de seguimiento. Piense 'syscall (SYS_open, ...)'. –

1

Ya debe estar ptrace ing la aplicación para interceptar sus operaciones de apertura y cierre de archivos.

Parecería trivial evitar la reutilización de FD "inyectando" llamadas dup2(X, Y); close(X); en la aplicación y ajustando Y para que sea lo que usted desee.

Sin embargo, la aplicación sí podría llegar a utilizar dup2 para forzar una re-uso de FD previamente cerrada, y puede no funcionar si se impide que, por lo que creo que vas a tener que lidiar con esto en post- paso de procesamiento

Además, es bastante fácil escribir una aplicación que se quedará sin FD si no permite la reutilización.

Cuestiones relacionadas