通过使用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) 可能会有所帮助。