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

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

有帮助吗?

解决方案

如果你在POSIXy系统上(我假设你是,因为你有 fileno()),你可以使用 dup() 克隆文件描述符:

int newfd = dup(fileno(stream));
fclose(stream);

或者你可以将 fdopen()交给一个重复的文件描述符:

FILE *stream = fdopen(dup(fd), "r");

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

其他提示

如果其他一切都失败了,dup(2)可能会有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top