关闭FILE指针而不关闭基础文件描述符

时间:2009-10-21 22:01:09

标签: c file stream stdio libc

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

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

2 个答案:

答案 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)可能会有所帮助。