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 

Nedenini anlamıyorum? Stream tabanlı IO'yu open() ile nasıl başarılı bir şekilde karıştırabilirim?Karıştırma fdopen() ve açık() -> kötü dosya tanımlayıcı

Çalıştığım bir kitaplık yalnızca bir tamsayı kabul eder (ve kütüphane kapanmak için dahili olarak sorumludur, muhtemelen yakın()), ancak yine de dosya ile çalışmam gerekir ve f() işlevinin, sizin için (fread(), ftell() gibi)

cevap

13

fclose çağrılarını close arayarak nasıl mümkün olduğunu nasıl görebileceğinizi öğrenin. Eğer fd'yi fclose, dup numaralı telefonu arayarak ilk önce fd'yi tutmak istiyorsanız.

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

sizin örnekte kötü bir dosya tanıtıcı hata mesajı fclose(dest1) çağrısından çekişmekte.

+0

Teşekkür ederiz! Fdopen() manpage, freopen() ve fopen() ile karıştırıldığı için man sayfayı yeterince okumamışımdır: / – Blub

İlgili konular