Закройте указатель 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 *
. Однако помните, что указатель местоположения является общим, поэтому будьте осторожны, если вы используете оба одновременно. Кроме того, любые блокировки fcntl ()
, сохраненные в оригинальном fd , будут сниматься при закрытии копии.
Другие советы
Если ничего не помогает, dup (2) может помочь.