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