通过使用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