关闭FILE指针而不关闭基础文件描述符
题
通过使用 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)可能会有所帮助。
不隶属于 StackOverflow