21

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

这种行为类似于调用fflush()then fileno(),然后不再使用FILE指针,除非在关闭时。另一个问题是,如果你再fdopen()一次,现在有多个FILE指针,你只能关闭其中一个。

4

2 回答 2

25

如果你在一个 POSIXy 系统上(我假设你是,因为你有fileno()),你可以dup()用来克隆文件描述符:

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

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

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

无论哪种方式,fd 的另一个副本都不会以FILE *. 但是,请记住位置指针共享的,因此如果同时使用两者,请小心。此外,当您关闭副本时fcntl(),原始 fd 上的任何锁定都将被释放。

于 2009-10-21T22:09:32.530 回答
1

如果一切都失败了,dup(2) 可能会有所帮助。

于 2009-10-21T22:10:16.953 回答