通过使用fdopen(),fileno()可以使用现有文件描述符打开流。但是,一旦您使用流打开文件,关闭文件的正确方法是fclose()指向FILE指针。如何关闭流,但保留打开的文件描述符?
这种行为类似于调用fflush()then fileno(),然后不再使用FILE指针,除非在关闭时。另一个问题是,如果你再fdopen()一次,现在有多个FILE指针,你只能关闭其中一个。
如果你在一个 POSIXy 系统上(我假设你是,因为你有fileno()),你可以dup()用来克隆文件描述符:
int newfd = dup(fileno(stream));
fclose(stream);
或者您可以fdopen()提供一个重复的文件描述符:
FILE *stream = fdopen(dup(fd), "r");
无论哪种方式,fd 的另一个副本都不会以FILE *. 但是,请记住位置指针是共享的,因此如果同时使用两者,请小心。此外,当您关闭副本时fcntl(),原始 fd 上的任何锁定都将被释放。
如果一切都失败了,dup(2) 可能会有所帮助。