установить параметры в адресном пространстве процесса, указав адрес пользователя, счетчик байтов, параметры ввода-вывода для пользователя;
получить индекс по записи в таблице файлов;
заблокировать индекс;
установить значение смещения в байтах для адресного пространства процесса по значению смещения в таблице файлов;
do (пока значение счетчика байтов не станет удовлетворительным)
{
превратить смещение в файле в номер дискового блока (алгоритм bmap);
вычислить смещение внутри блока и количество байт, которые будут прочитаны;
if (количество байт для чтения == 0) /* попытка чтения конца файла */
break; /* выход из цикла */
прочитать блок (алгоритм breada, если производится чтение с продвижением, и алгоритм bread — в противном случае);
скопировать данные из системного буфера по адресу пользователя;
скорректировать значения полей в адресном пространстве процесса, указывающие смещение в байтах внутри файла, количество прочитанных байт и адрес для передачи в пространство пользователя;
освободить буфер; /* заблокированный в алгоритме bread */
}
разблокировать индекс;
скорректировать значение смещения в таблице файлов для следующей операции чтения;
return (общее число прочитанных байт);
}
Рисунок 5.5. Алгоритм чтения из файла
mode чтение или запись
count количество байт для чтения или записи
offset смещение в байтах внутри файла
address адрес места, куда будут копироваться данные, в памяти пользователя или ядра
flag отношение адреса к памяти пользователя или к памяти ядра
Рисунок 5.6. Параметры ввода-вывода, хранящиеся в пространстве процесса
Затем в алгоритме начинается цикл, выполняющийся до тех пор, пока операция чтения не будет произведена до конца. Ядро преобразует смещение в байтах внутри файла в номер блока, используя алгоритм bmap, и вычисляет смещение внутри блока до места, откуда следует начать ввод-вывод, а также количество байт, которые будут прочитаны из блока. После считывания блока в буфер, возможно, с продвижением (алгоритмы bread и breada) ядро копирует данные из блока по назначенному адресу в пользовательском процессе. Оно корректирует параметры ввода-вывода в адресном пространстве процесса в соответствии с количеством прочитанных байт, увеличивая значение смещения в байтах внутри файла и адрес места в пользовательском процессе, куда будет доставлена следующая порция данных, и уменьшая число байт, которые необходимо прочитать, чтобы выполнить запрос пользователя. Если запрос пользователя не удовлетворен, ядро повторяет весь цикл, преобразуя смещение в байтах внутри файла в номер блока, считывая блок с диска в системный буфер, копируя данные из буфера в пользовательский процесс, освобождая буфер и корректируя значения параметров ввода-вывода в адресном пространстве процесса. Цикл завершается, либо когда ядро выполнит запрос пользователя полностью, либо когда в файле больше не будет данных, либо если ядро обнаружит ошибку при чтении данных с диска или при копировании данных в пространство пользователя. Ядро корректирует значение смещения в таблице файлов в соответствии с количеством фактически прочитанных байт; поэтому успешное выполнение операций чтения выглядит как последовательное считывание данных из файла. Системная операция lseek (раздел 5.6) устанавливает значение смещения в таблице файлов и изменяет порядок, в котором процесс читает или записывает данные в файле.
#include ‹fcntl.h›
main()
{
int fd;
char lilbuf[20], bigbuf[1024];
fd = open("/etc/passwd", O_RDONLY);
read(fd, lilbuf, 20);
read(fd, bigbuf, 1024);
read(fd, lilbuf, 20);
}
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии