Закройте указатель 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) может помочь.