我用 fdopen(fd, "w+")
打开了一个 FILE *f
,并且希望在使用 fclose(f)
关闭文件后保持 fd
打开状态。
有没有更好的方法实现这个功能?
我可以简单调用 fflush(f); free(f);
吗,这样做是否存在风险?
还是说有一种方式可以将内部的 fd
更改为无效值 -1
,以便 fclose()
不能关闭 fd
?
如果您真的想使用FILE
对象而不是文件描述符,那么您不必担心close()
关闭文件描述符: fclose()
会为您完成这个操作。此外,如果性能很重要,您应该关注所有在f*()
标准I/O函数中定义的fdopen()
和包装系统调用。非常感谢所有评论!
另请参阅fclose man page:
fclose()
函数刷新由fp
指向的流(使用fflush(3)
写入任何缓冲输出数据)并关闭底层文件描述符。
fdopen()
中的文件描述符进行的任何 write
等系统调用都会被 fclose()
使无效。 - GooseDeveloperf*()
函数进行缓冲,以减少系统调用。它不仅仅是一个包装器。 - Cosinus
dup(fileno(f))
。 - rodrigofree(f)
是一个非常糟糕的想法。此外,调用dup()
是廉价的,肯定不比fflush()
更昂贵。 - rodrigoint fd2 = dup(fd); f = fdopen(fd2, "w+");
...fclose(f);
并测量增加dup
对性能的影响。请在问题中添加更多信息:您的用例是什么?为什么您需要使用fdopen
和fclose
并保持fd
打开状态?也许有不同的解决方案。 - Bodofclose()
,您就能获得最佳性能和可移植性。只需执行fflush(f)
,然后随意操作fd即可。 - Nate EldredgeFILE *
进行网络 IO?除非你为每个连接使用一个线程,否则阻塞 IO 会影响性能。而且FILE *
不支持非阻塞 IO。 - HAL9000