2009-10-21 74 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)可能会有所帮助。

相关问题