2011-12-07 11 views
5
int source = open("hi", O_CREAT | O_RDONLY); 
int dest = open("resultfile", O_CREAT | O_RDWR | O_TRUNC); 

FILE* source1 = fdopen(source, "r"); 
FILE* dest1 = fdopen(dest, "w+"); 

// outside of a testcase I would write something into 'resultfile' here 

close(source); 
close(dest); 
fclose(source1); 
fclose(dest1); 

int sourcef = open("resultfile", O_RDONLY); 
printf(strerror(errno)); // <--- Bad file descriptor 

No entiendo por qué? ¿Cómo puedo combinar con éxito IO basado en stream con open()?fdopen de mezcla() y abierta() -> mala descriptor de archivo

Una biblioteca con la que estoy trabajando solo acepta un entero fd (y la biblioteca es internamente responsable de cerrarlo, presumiblemente con close()), pero todavía necesito trabajar con el archivo, y no lo hago ver cómo eso es posible sin las llamadas f() como (fread(), ftell() etc)

Respuesta

13

fclose llamadas close para usted. Si desea mantener el fd alrededor después de llamar al fclose, dup primero la fd.

int fd = open(...); 
int fd2 = dup(fd); 
FILE *fp = fdopen(fd2); 
fclose(fp); 
// fd is still valid. 

El mensaje de error descriptor de archivo mal en su ejemplo es persistente de la llamada fclose(dest1).

+0

¡Gracias! No leí la página de manual con suficiente cuidado porque la página de manual de fdopen() está mezclada con freopen() y fopen(): / – Blub

Cuestiones relacionadas