2011-09-04 8 views

Respuesta

12

Esa es una pregunta difícil. Sin embargo, el estándar POSIX cubrirlo en la descripción de close():

Si close() es interrumpido por una señal que es ser cogido, devolverá -1 con errno establecido en [EINTR] y el estado de los filtros no especificados. Si se produjo un error de E/S al leer o escribir en el sistema de archivos durante close(), puede devolver -1 con errno establecido en [EIO]; si se devuelve este error, el estado de los filtros no se especifica.

Por lo tanto, el estado del descriptor de archivo no está especificado en el estándar.

Para la mayoría de los propósitos prácticos, está cerrado; hay muy poco que puede hacer con el descriptor de archivo, incluso si está oficialmente abierto. Puede intentar una operación inocua (como fcntl() y F_GETFL) y ver si vuelve a obtener EBADF, lo que indica que el descriptor está formalmente cerrado. Pero si está abierto y la causa del error EIO es permanente, entonces es probable que obtenga EIO cada vez que intente hacer algo con él (posiblemente incluyendo la llamada fcntl()). Es posible que nunca obtenga el mismo descriptor devuelto por otra operación de tipo abierto. No está claro que incluso dup2() pueda tener éxito al especificar el descriptor de archivo 'muerto' como el destino si el descriptor de archivo inactivo está abierto pero no se puede cerrar.

+8

Si su programa es multiproceso o utiliza controladores de señal, entonces probar el descriptor de archivo con 'fcntl()' puede no ser tan sencillo, ya que puede haber sido cerrado y luego reutilizado para otra cosa. – mark4o

+0

¿Es esto un problema si uno usa un marco no stdio como libuv? – Breton

+0

Sí, esto es un problema en cualquier marco construido usando 'open()', 'close()' y parientes, entonces a menos que 'libuv' use un conjunto diferente de llamadas al sistema que' open() 'y' close() ' (lo cual es bastante improbable), podría sufrir problemas con 'close()' fallando y dejando el descriptor de archivo en un estado indeterminado. –

Cuestiones relacionadas