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

Mat*_*ner 16 c file stdio stream libc

通过使用fdopen(),fileno()可以使用现有文件描述符打开流.然而,正确的方法关闭文件,一旦你与流打开它要fclose()FILE指针.如何关闭流,但保留打开的文件描述符?

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

bdo*_*lan 21

如果您使用的是POSIXy系统(我认为fileno()您可以使用),您可以使用dup()克隆文件描述符:

int newfd = dup(fileno(stream));
fclose(stream);
Run Code Online (Sandbox Code Playgroud)

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

FILE *stream = fdopen(dup(fd), "r");
Run Code Online (Sandbox Code Playgroud)

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