Закройте указатель FILE, не закрывая основной файловый дескриптор - PullRequest
15 голосов
/ 22 октября 2009

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

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

Ответы [ 2 ]

21 голосов
/ 22 октября 2009

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

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

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

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

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

1 голос
/ 22 октября 2009

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

...