¿Cómo obtener un puntero de ARCHIVO de un descriptor de archivo?

Respuestas:

101

Utilizar fdopen():

FILE* fp = fdopen(fd, "w");
Richard Pennington
fuente
34
Y para obtener el descriptor de archivo de un ARCHIVO * use fileno(): linux.die.net/man/3/fileno
Lee Netherton
2
si fdse abrió con algunas banderas (como O_NONBLOCK), ¿qué pasará con ellas después de que se fdopenabra con nuevas banderas? ¿Serán xorsustituidos o juntos?
xealits
5
@jww: Para empezar, los descriptores de archivo no son ANSI C.
Rufflewind
2
¿Es malo de alguna manera llamar fdopenvarias veces? (asumiendo que sucede dentro de alguna función que se llama una y otra vez)
phil294
2
@xealits Las opciones para el ARCHIVO * deben estar dentro del alcance del descriptor de archivo ya abierto. Entonces, si ha abierto fd con solo lectura y el ARCHIVO * con solo escritura, debería lanzar una excepción. Para obtener más información, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark
28

FILE* f = fdopen(d, "w");

man fdopen salida:

SINOPSIS

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

La fdopen()función asocia un flujo con el descriptor de archivo existente, fildes. El modo de la secuencia debe ser compatible con el modo del descriptor de archivo. Cuando el arroyo se cierra vía fclose(3), fildestambién se cierra.

Gregory Pakosz
fuente
1
No disponible en ANSI C.
jww
Para obtener más claridad, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark
-8

No hay una forma estándar de hacer esto (o al revés) ya que el Estándar C no tiene nada que decir sobre los descriptores de archivos. Su plataforma específica puede proporcionar o no dicho mecanismo.


fuente
17
Depende de lo que quiera decir con "estándar". POSIX es un estándar.
Richard Pennington
12
La pregunta era sobre descriptores de archivos. ;-)
Richard Pennington
11
@Neil> la pregunta etiquetada como C no significa "dime la verdad sobre el estándar C", sino más bien "Estoy codificando en C, no lo hago, por favor dime si es posible y cómo. "
Gregory Pakosz
8
Estoy de acuerdo en que no hay una forma estándar de hacer esto, pero la mención del OP mkstempimplica que las soluciones no estándar son aceptables en este caso particular. En ese caso, sin embargo, debería haber agregado la posixetiqueta (que veo que ya se agregó).
Emerick Rogul
9
@Neil, y el propósito de la Red y el significado de la vida. Tendría más sentido si dijera que tiene una opinión diferente. También dudo que SO se trate de burlarse de los estándares. Y no es muy práctico confiar en las habilidades de etiquetado de alguien con una experiencia de SO correspondiente a la reputación de 23.
Michael Krelin - hacker