¿Cómo puedo convertir un puntero de archivo ( FILE* fp ) en un descriptor de archivo (int fd)?

3 minutos de lectura

avatar de usuario
phil molinero

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?

  • 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

avatar de usuario
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

avatar de usuario
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

avatar de usuario
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;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad