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

StackOverflow https://stackoverflow.com/questions/1603916

  •  05-07-2019
  •  | 
  •  

Вопрос

Используя 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) может помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top