Взаимодействие файловых дескрипторов POSIX и файлов C - PullRequest
1 голос
/ 24 декабря 2011

Я читаю спецификацию POSIX и не могу полностью понять, как взаимодействуют дескрипторы файлов, описания файлов и потоки.

FILE* f1 = fopen("a.txt", "r");
int fno = fileno(f1);
FILE* f2 = fdopen(fno, "r");

// is it true?
assert(fileno(f2) == fno);

// does it close only f1 or f2 too?
fclose(f1);
fgetc(f2); // valid?

(Вопрос в комментариях.)

Ответы [ 2 ]

4 голосов
/ 24 декабря 2011

Стандартная библиотека C предоставляет непрозрачный указатель FILE*, дескриптор файла , которым вы можете манипулировать с помощью fopen() / fclose(), и доступ с помощью fread() / fwrite().

POSIX предлагает понятие файловых дескрипторов , которые являются целыми числами. Вы можете манипулировать ими с помощью open() / close() и получать доступ с помощью read() / write().

Для каждого дескриптора открытого файла FILE * fp в системе POSIX вы можете получить базовый дескриптор файла с помощью fileno(fp). И наоборот, для существующего файлового дескриптора n вы можете открыть стандартный дескриптор файла с помощью fdopen(n).

Другими словами, файловые дескрипторы POSIX - это примитив операционной системы, который используется для реализации стандартной библиотеки io на языке Си. Обратите внимание, что дескрипторы файлов POSIX также служат дескрипторами для сокетов.

Ваш последний вызов fgets() не определен, потому что fclose() делает недействительным дескриптор файла и, следовательно, его базовый дескриптор файла. fdopen() не не дублирует дескриптор файла.

1 голос
/ 24 декабря 2011

Да, это правда, и закрывает оба файла, так как они используют один и тот же дескриптор файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...