通過使用fdopen()
,fileno()
可以使用現有文件描述符打開流。但是,關閉文件的正確方法是,一旦您用流打開文件,則指向fclose()
FILE
指針。如何關閉流,但保留打開的文件描述符?關閉文件指針而不關閉底層文件描述符
此行爲類似於調用fflush()
然後fileno()
,然後再也不使用FILE
指針,除非在關閉時。另外值得關注的是,如果你再次fdopen()
,現在有多個FILE
指針,你只能關閉其中的一個。
通過使用fdopen()
,fileno()
可以使用現有文件描述符打開流。但是,關閉文件的正確方法是,一旦您用流打開文件,則指向fclose()
FILE
指針。如何關閉流,但保留打開的文件描述符?關閉文件指針而不關閉底層文件描述符
此行爲類似於調用fflush()
然後fileno()
,然後再也不使用FILE
指針,除非在關閉時。另外值得關注的是,如果你再次fdopen()
,現在有多個FILE
指針,你只能關閉其中的一個。
如果你是一個POSIXy系統(我假設你,因爲你有fileno()
),你可以使用dup()
克隆文件描述符:
int newfd = dup(fileno(stream));
fclose(stream);
或者你可以用手fdopen()
重複文件描述:
FILE *stream = fdopen(dup(fd), "r");
無論哪種方式,FD的其他副本不會關閉與FILE *
。但請記住,共享位置指針爲,因此如果您同時使用兩者,請小心。另外,在關閉副本時,原始fd 上保留的任何fcntl()
鎖將被釋放,其中將被釋放。
如果一切都失敗,dup(2)可能會有所幫助。
windows和其他平臺支持fileno()! 我不敢相信我沒有想到這個dup()解決方案,非常優雅,而且很明顯 – 2009-10-21 22:17:02
難道你還不需要將新的fd複製到原來的fd然後關閉()新的fd所以一切都恢復了原來的樣子,除了文件流已關閉? :D這意味着在執行fclose()之前,您需要oldfd = fileno(stream)。 – 2009-10-21 22:17:52
喬納森,在多線程應用程序中做的事情很活潑。在給fd打開'fdopen'之前'dup'好一些,所以你可以確定它永遠不會碰到你的原始文件。 – bdonlan 2009-10-21 22:35:34