Читайте также:
|
|
Совокупность операций, при помощи которых программа читает и записывает файлы, называется вводом-выводом (input/output). Если программа читает и записывает файлы посредством прямого обращения к ядру операционной системы, то такой ввод-вывод называется низкоуровневым.
Чтобы понять работу механизмов низкоуровневого ввода-вывода в Linux, рассмотрим сначала принципы чтения и записи файлов в стандартной библиотеке языка С.
Любую модель файлового ввода-вывода можно условно поделить на следующие составляющие:
1. абстракция файла;
2. механизмы открытия и закрытия файлов;
3. механизмы чтения и записи файлов;
4. механизмы произвольного доступа к данным в файле.
Применяя эти понятия к вводу-выводу стандартной библиотеки языка С, мы имеем возможность изучать низкоуровневый ввод-вывод в сравнении с аналогичными механизмами высокого уровня.
Абстракция файла в стандартной библиотеке языка С реализуется через тип данных file. Для этого создается указатель, который в дальнейшем будет участвовать в файловых операциях:
FILE * myfile;
Особого рассмотрения требуют следующие глобальные экземпляры:
extern FILE * stdin;
extern FILE * stdout;
extern FILE * stderr;
Эта "троица" представляет собой стандартный ввод (stdin), стандартный вывод (stdout) и стандартный поток ошибок (stderr). Ввод-вывод в Linux построен на одной аксиоме, которая гласит, что любая операция чтения или записи данных сводится к файловому вводу-выводу. Таким образом, любое "нечто", способное принимать или отправлять данные (клавиатура, экран, аппаратные устройства, сетевые соединения и т. п.) можно представить в виде файла.
Стандартный ввод, стандартный вывод и стандартный поток ошибок — это виртуальные "порталы", через которые система взаимодействует с пользователем. Как правило, стандартный ввод связан с драйвером клавиатуры, а стандартный вывод и стандартный поток ошибок ассоциируются с дисплеем компьютера.
Механизмы открытия и закрытия файлов в стандартной библиотеке языка С представлены следующими функциями:
FILE * fopen (const char * FLOCATION, const char * OPENJMODE);
FILE * freopen (const char * FLOCATION, const char * OPEN_MODE,FILE * FP);
FILE * fClose (FILE * FP);
Механизмы чтения и записи файлов реализованы в стандартной библиотеке в виде следующих функций:
int fgetc (FILE * FP);
int fputc (int byte, FILE * FP);
char * fgets (char * STR, int SIZE, FILE * FP);
int fputs (const char * STR, FILE * FP);
int fscanf (FILE * FP, const char * FMT,...);
int fprintf (FILE * FP, const char * FMT,...);
int vfscanf (FILE * FP, const char * FMT, va_list ap);
int vfprintf (FILE * FP, const char * FMT, va_list ap);
Файловый ввод-вывод предполагает, что чтение и запись данных осуществляются последовательно. Для этого к абстракции файла привязывается понятие текущей позиции ввода-вывода. Текущая позиция устанавливается в начало файла в момент его открытия. Операции чтения/записи смещают эту позицию вперед на количество прочитанных или записанных байтов. Для принудительного изменения текущей позиции используются механизмы произвольного доступа (random access). В стандартной библиотеке языка С произвольный доступ к данным осуществляется при помощи следующих механизмов:
· #define SEEK_SET 0
· «define SEEK_CUR 1
· «define SEEK_END 2
· typedef struct {...} fpos_t;
· int fseek (FILE * FP, long int OFFSET, int WHENCE);.
· int fgetpos (FILE * FP, fpos_t * POSITION);
· int fsetpos (FILE * FP, fpos_t * POSITION!;
· long int ftell (FILE * FP);
· void rewind (FILE * FP);
Рассмотрим пример программы, которая читает из файла "хвост" заданного размера и выводит его на экран. Первый аргумент программы— имя файла, второй аргумент— размер "хвоста". Все операции ввода-вывода осуществляются средствами стандартной библиотеки языка С.
Дата добавления: 2014-12-15; просмотров: 104 | Поможем написать вашу работу | Нарушение авторских прав |