tengo un FILE *
devuelto por una llamada a fopen()
. Necesito obtener un descriptor de archivo de él, para hacer llamadas como fsync(fd)
en eso. ¿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 ) en un descriptor de archivo (int fd)?
phil molinero
phil molinero
La función adecuada es int fileno(FILE *stream)
. Se puede encontrar en <stdio.h>
y es un estándar POSIX pero no el estándar C.
-
Estrictamente hablando, no sería necesario mencionar ningún encabezado o biblioteca si la función fuera realmente parte de la biblioteca C estándar. Sin embargo, no es estándar, por lo que podría tener sentido mencionar al menos el encabezado.
– Ant
2 de julio de 2010 a las 23:55
-
El acceso a funciones en la biblioteca C estándar requiere incluir encabezados, al menos si su compilador espera prototipos (nunca recuerdo cuál es realmente el comportamiento estándar a ese respecto). Sin encabezados, no se definen nombres al principio de un archivo C.
– Phil Miller
3 de julio de 2010 a las 0:20
-
@Novelocrat: No quise decir que no hay necesidad de
#include
cualquier cosa. Simplemente quise decir que siempre es fácil encontrar el nombre del encabezado adecuado para un estándar función. Es decir, no es realmente crítico mencionar el nombre exacto del encabezado en la respuesta.– Ant
3 de julio de 2010 a las 1:51
-
Esta es una buena respuesta, pero vale la pena señalar que esta no es una función c estándar, es una función posix.
– Evan Terán
3 de julio de 2010 a las 4:00
-
No está en el estándar C, porque los descriptores de archivo son una cosa de UNIX (en Linux, está abierto (2), no abierto (3)).
– no-un-usuario
16 de octubre de 2014 a las 9:08
Marcos Gerolimatos
Incluso si fileno(FILE *)
puede devolver un descriptor de archivo, tenga MUCHO cuidado de no omitir el búfer de stdio. Si hay datos de búfer (ya sea de lectura o de escritura sin vaciar), las lecturas/escrituras del descriptor de archivo pueden generar resultados inesperados.
Para responder a una de las preguntas secundarias, para convertir un descriptor de archivo en un puntero de ARCHIVO, use fdopen(3)
-
No creo que esto haya sido útil para las personas que buscan esto específicamente, y esto ya se respondió 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 en lugar de información real.
– kevr
1 de febrero de 2018 a las 15:03
-
Los comentarios que son muuuy importantes deben plantearse como respuestas. Un gran porcentaje de los comentarios son metacomentarios sarcásticos y sin sentido como el tuyo… y este 😉
–Mark Gerolimatos
15 de enero de 2019 a las 21:47
-
@MarkGerolimatos esta respuesta es realmente útil, pero lo sería aún más si proporcionara más información. Específicamente, si quiero leer/escribir en el descriptor del archivo, ¿cómo evito pasar por alto el búfer de stdio? ¡Gracias!
– Max888
20 de noviembre de 2021 a las 15:32
jim hawkins
fd = _fileno(fp); // Probably the best way
fd = fp->_file; // direct from the FILE structure, member
typedef struct _iobuf {
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname; } FILE;
O podría abrir el archivo con open(2), y tendría un descriptor de archivo desde el principio
– Antoine Pelisse
29 de junio de 2013 a las 16:13
Y a la inversa: ¿Cómo obtener un puntero de ARCHIVO desde un descriptor de archivo?
– Michael Burr
1 oct 2013 a las 20:35