2011-12-07 3 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 

私は理由を理解していませんか?ストリームベースのIOをopen()とうまく組み合わせるにはどうすればよいですか?ミキシングのfdopen()およびオープン() - >不正なファイルディスクリプタ

私が扱っているライブラリは整数fdを受け入れます(ライブラリは内部的にはclose()を使って終了します)が、まだファイルを扱う必要があります。 (fread()、ftell()などのf()呼び出しがなくても、どうすれば適切に可能かを見てください。

答えて

13

fclosecloseがあります。 fcloseを呼び出した後にfdを保持したい場合は、fdを最初にdupにしてください。

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

あなたの例では不正なファイルディスクリプタのエラーメッセージがfclose(dest1)呼び出しから長引くれます。

+0

ありがとうございました! fdopen()のマニュアルページがfreopen()とfopen()と混在しているため、慎重にマンページを読み込まなかった:/ – Blub

関連する問題