2011-05-25 11 views

Respuesta

49

Se establece el close-on-exec bandera para el descriptor de archivo, lo que hace que el descriptor de archivo para ser automáticamente (y atómicamente) cierra cuando cualquiera de las funciones exec -Familia éxito.

También prueba el valor de retorno para ver si la operación falló, lo cual es bastante inútil si el descriptor de archivo es válido, ya que no hay ninguna condición bajo la cual esta operación falle en un descriptor de archivo válido.

+2

Tenga en cuenta que no hace nada sobre la eliminación de cualquier secuencia de archivos ('FILE *') asociada con el descriptor de archivo. Un uso válido para FD_CLOEXEC es cerrar un archivo de registro que el proceso principal haya abierto al ejecutar un proceso de shell. Tenga en cuenta que POSIX 2008 tiene una opción para ['open (2)'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) para O_CLOEXEC - para que pueda establecer esta propiedad cuando abra el archivo, que será muy útil una vez que esté ampliamente disponible. –

+0

Establecer el indicador de forma atómica cuando se abre el archivo es bastante esencial para cualquier programa con subprocesos que pueda estar abriendo archivos mientras otro subproceso podría estar ejecutando programas externos. Desafortunadamente solo está disponible para 'abrir' y no' aceptar', 'socket',' pipe', etc ... –

+0

Sí, hay problemas de diseño al agregar O_CLOEXEC o equivalente a las otras funciones de creación de descriptores de archivos (aunque 'dup () 'y' dup2() 'no se ven afectados, por supuesto). Probablemente tendrías que tener nuevas funciones con un parámetro extra 'mode' o 'flags', que es presumiblemente por qué no sucedió. Si pudiera usar O_CLOEXEC en el socket, entonces podría suponer que 'accept()' clonaría ese indicador en el descriptor que devuelve. Pero 'socket()' y 'pipe()' son más complicados. –

23

Marca el descriptor de archivo por lo que será close() d automáticamente cuando el proceso o los hijos de TI fork() s llama a uno de los exec*() familia de funciones. Esto es útil para evitar filtrar los descriptores de archivos a programas aleatorios ejecutados por, p. Ej. system().

+0

¿Es esto un problema de seguridad? – zach