2010-07-02 16 views
129

Tengo un FILE *, devuelto por una llamada al fopen(). Necesito obtener un descriptor de archivo para hacer llamadas como fsync(fd). ¿Cuál es la función para obtener un descriptor de archivo desde un puntero de archivo?¿Cómo puedo convertir un puntero de archivo (FILE * fp) a un descriptor de archivo (int fd)?

+7

auto-respuestas en esta forma "riesgo" se les anima. – dmckee

+0

O podría abrir el archivo con abrir (2), y tendría un descriptor de archivo desde el principio –

+6

Y el inverso: [¿Cómo obtener un puntero ARCHIVO desde un descriptor de archivo?] (Http://stackoverflow.com/ questions/1941464/how-to-get-a-file-pointer-from-a-file-descriptor) –

Respuesta

168

La función correcta es int fileno(FILE *stream). Se puede encontrar en <stdio.h>, y es un estándar POSIX pero no es estándar.

+4

Estrictamente hablando, no habría ninguna necesidad de mencionar encabezados o bibliotecas si la función era de hecho una parte del estándar Biblioteca C Sin embargo, no es estándar, por lo que podría tener sentido mencionar el encabezado al menos. – AnT

+16

El acceso a las funciones en la biblioteca C estándar requiere incluir encabezados, al menos si su compilador espera prototipos (nunca recuerdo qué comportamiento estándar es en ese sentido). Sin encabezados, no se definen nombres al principio de un archivo C. – Novelocrat

+0

@Novelocrat: no quise decir que no hay necesidad de '#incluir' nada. Simplemente quise decir que siempre es fácil encontrar el nombre del encabezado adecuado para una función * estándar *. Es decir. no es realmente crítico mencionar el nombre exacto del encabezado en la respuesta. – AnT

27

Incluso si fileno(FILE *) puede devolver un descriptor de archivo, tenga MUCHO cuidado de no pasar por alto el búfer de stdio. Si hay datos de búfer (ya sean leídos o no), las lecturas/escrituras del descriptor de archivo pueden dar resultados inesperados.

Para contestar una de las preguntas laterales, para convertir un descriptor de archivo a un puntero de archivo, utilice fdopen(3)

+0

No creo que esto haya sido útil para las personas que buscan esto específicamente, y esto ya se ha respondido en la sección de comentarios de la publicación de OP un mes antes de que se escribiera. Esto es más una aclaración lógica que una información real. – kevr

Cuestiones relacionadas