关闭 FILE 指针而不关闭底层文件描述符

发布于 2024-08-08 07:35:40 字数 337 浏览 7 评论 0原文

通过使用 fdopen()fileno() 可以使用现有文件描述符打开流。然而,使用流打开文件后,关闭文件的正确方法是使用 fclose() FILE 指针。如何关闭流,但保留打开的文件描述符?

此行为类似于调用 fflush(),然后调用 fileno(),然后不再使用 FILE 指针,除非在关闭时。另一个问题是,如果您再次使用 fdopen(),现在会出现多个 FILE 指针,并且您只能关闭其中一个。

By using fdopen(), fileno() it's possible to open streams with existing file descriptors. However the proper way to close a file, once you've opened it with a stream is to fclose() the FILE pointer. How can one close the stream, but retain the open file descriptor?

This behaviour is akin to calling fflush() and then fileno(), and then never using the FILE pointer again, except in closing. An additional concern is that if you then fdopen() again, there are now multiple FILE pointers, and you can only close one of them.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

星星的軌跡 2024-08-15 07:35:40

如果您使用的是 POSIXy 系统(我假设您是这样,因为您有 fileno()),您可以使用 dup() 来克隆文件描述符:

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

或者您可以向 fdopen() 提供一个重复的文件描述符

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

:这样,fd 的另一个副本将不会与 FILE * 一起关闭。但是,请记住位置指针共享的,因此如果您同时使用两者,请务必小心。此外,当您关闭副本时,原始 fd 上持有的任何 fcntl() 锁都将被释放。

If you're on a POSIXy system (which I assume you are, since you have fileno()), you can use dup() to clone the file descriptor:

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

Or you can hand fdopen() a duplicate file descriptor:

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

Either way, the other copy of the fd won't close with the FILE *. However, keep in mind the location pointer is shared, so be careful if you are using both at the same time. Also, any fcntl() locks held on the original fd will be released when you close the copy.

酷遇一生 2024-08-15 07:35:40

如果其他一切都失败了,dup(2) 可以提供帮助。

If everything else fails, dup(2) could help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文