Что представляет собой 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 эта структура данных называется таблицей дескрипторов файлов, и каждый процесс имеет свою собственную таблицу дескрипторов файлов. Пользовательское приложение передает абстрактный ключ ядру через системный вызов, и ядро получает доступ к файлу от имени приложения на основе ключа. Само приложение не может напрямую читать или записывать таблицу дескрипторов файлов.
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.