2009-10-21 73 views
12

通過使用fdopen(),fileno()可以使用現有文件描述符打開流。但是,關閉文件的正確方法是,一旦您用流打開文件,則指向fclose()FILE指針。如何關閉流,但保留打開的文件描述符?關閉文件指針而不關閉底層文件描述符

此行爲類似於調用fflush()然後fileno(),然後再也不使用FILE指針,除非在關閉時。另外值得關注的是,如果你再次fdopen(),現在有多個FILE指針,你只能關閉其中的一個。

回答

18

如果你是一個POSIXy系統(我假設你,因爲你有fileno()),你可以使用dup()克隆文件描述符:

int newfd = dup(fileno(stream)); 
fclose(stream); 

或者你可以用手fdopen()重複文件描述:

FILE *stream = fdopen(dup(fd), "r"); 

無論哪種方式,FD的其他副本不會關閉與FILE *。但請記住,共享位置指針,因此如果您同時使用兩者,請小心。另外,在關閉副本時,原始fd 上保留的任何fcntl()鎖將被釋放,其中將被釋放。

+0

windows和其他平臺支持fileno()! 我不敢相信我沒有想到這個dup()解決方案,非常優雅,而且很明顯 – 2009-10-21 22:17:02

+0

難道你還不需要將新的fd複製到原來的fd然後關閉()新的fd所以一切都恢復了原來的樣子,除了文件流已關閉? :D這意味着在執行fclose()之前,您需要oldfd = fileno(stream)。 – 2009-10-21 22:17:52

+0

喬納森,在多線程應用程序中做的事情很活潑。在給fd打開'fdopen'之前'dup'好一些,所以你可以確定它永遠不會碰到你的原始文件。 – bdonlan 2009-10-21 22:35:34

1

如果一切都失敗,dup(2)可能會有所幫助。

相關問題