Что представляет собой fd при вводе: int fd = open ("file");?

Я смотрю на операции ввода-вывода на C++, и у меня есть вопрос. При открытии файла, например:

#include <fcntl.h>
int main() {
    unsigned char buffer[16];     
    int fd = open (argv[1], O_RDONLY);
    read(fd, buffer, sizeof(buffer));
    return 0;
}

как переменная fd представлять файл как целое число при передаче его в open способ? Это repesenting файл в текущей папке? Если я печатаю fdvariable, он печатает 3. Что это значит?

Ps. Я знаю, что есть несколько других способов обработки файлов, таких как stdio.ч, fstream и т. д. Но это выходит за рамки этого вопроса. Ds.

5 ответов


как переменная fd может представлять файл как целое число при передаче его в метод open?

это дескриптор, который идентифицирует открытый файл; он обычно называется дескриптор, отсюда и название fd.

при открытии файла операционная система создает некоторые ресурсы, необходимые для доступа к нему. Они хранятся в какой-то структуре данных (возможно, в простом массиве), которая использует целое число в качестве ключа; вызов open возвращает это целое число, чтобы при передаче его read операционная система может использовать его, чтобы найти необходимые ресурсы.

это repesenting файл в текущей папке?

он представляет файл, который вы открыли; его имя файла было argv[1], первый из аргументов, который был передан программе при ее запуске. Если этот файл не существует, или open по какой-то причине не удалось, тогда он имеет значение -1 и не представлять любой файл, вы действительно должны проверить это, прежде чем пытаться сделать что-нибудь с ним.

если я напечатаю fd переменная, она печатает 3. Что это значит?

он не имеет никакого конкретного значения; но он имеет это значение, потому что это был четвертый файл (или файлоподобная вещь), который был открыт после входных (0), выходных (1) и ошибок (2) потоков, которые используются cin, cout и cerr в C++.


потому что это индекс таблицы ресурсов, хранящихся для текущего процесса.

каждый процесс имеет свою таблицу ресурсов, поэтому вам просто нужно передать указатель read/write/etc функции

как правило, файловый дескриптор-это индекс записи в структуре данных резидента ядра, содержащей сведения обо всех открытых файлах. В POSIX эта структура данных называется таблицей дескрипторов файлов, и каждый процесс имеет свою собственную таблицу дескрипторов файлов. Пользовательское приложение передает абстрактный ключ ядру через системный вызов, и ядро получает доступ к файлу от имени приложения на основе ключа. Само приложение не может напрямую читать или записывать таблицу дескрипторов файлов.

from:http://en.wikipedia.org/wiki/File_descriptor


open () возвращает дескриптор файла, который является типом C int. Чтобы узнать больше о дескриптор файла см. http://en.wikipedia.org/wiki/File_descriptor.


" fd " означает файловый дескриптор. Это значение, идентифицирующее файл. Часто это индекс (в глобальной таблице), смещение или указатель. Разные API используют разные типы. WinAPI, например, использует различные типы дескрипторов (HANDLE,HGDI и т. д.), которые по существу являются typedefs для int/void* / long и так далее.

использование голых типов, таких как" int", обычно не является хорошей идеей, но если реализация говорит вам сделать это (например, POSIX в этом случае), вы должны сохранить его.


упрощенный ответ:fd - Это просто индекс в массиве дескрипторов файлов.

когда большинство процессов запущены, они получают три открытых файловых дескриптора для начала:stdin (0), stdout (1), и stderr (2). Поэтому, когда вы открываете первый файл, следующая доступная запись массива 3.