Закройте указатель FILE, не закрывая базовый файловый дескриптор

Используя fdopen(), fileno(), можно открыть потоки с существующими файловыми дескрипторами. Однако правильный способ закрыть файл, как только вы открыли его с потоком, это fclose() указатель FILE. Как закрыть поток, но сохранить открытый файловый дескриптор?

Это поведение похоже на вызов fflush(), а затем fileno(), а затем никогда не использовать указатель FILE снова, кроме как закрытие. Еще одна проблема заключается в том, что если вы снова fdopen(), теперь есть несколько указателей FILE, и вы можете закрыть только один из них.

Ответ 1

Если вы находитесь в системе POSIXy (я полагаю, что у вас есть fileno()), вы можете использовать dup() для клонирования дескриптора файла:

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

Или вы можете передать fdopen() дубликат дескриптора файла:

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

В любом случае, другая копия fd не будет закрыта с помощью FILE *. Однако имейте в виду, что указатель местоположения является общим, поэтому будьте осторожны, если вы используете оба одновременно. Кроме того, любые блокировки fcntl(), хранящиеся на исходном fd, будут освобождены при закрытии копии.

Ответ 2

Если все остальное не удается, dup (2) может помочь.