Архитектура операционной системы UNIX



         

ДИСКОВЫЕ ДРАЙВЕРЫ - часть 3


Рассмотрим программу, приведенную на , в применении к файлам "/dev/dsk15" и "/dev/rdsk15", и предположим, что команда ls выдала следующую информацию: ls -1 /dev/dsk15 /dev/rdsk15 br-------- 2 root root 0,21 Feb 12 15:40 /dev/dsk15 crw-rw---- 2 root root 7,21 Mar 7 09:29 /dev/rdsk15

Отсюда видно, что файл "/dev/dsk15" соответствует устройству блочного типа, владельцем которого является пользователь под именем "root", и только пользователь "root" может читать с него непосредственно. Его старший номер 0, младший - 21. Файл "/dev/rdsk15" соответствует устройству посимвольного ввода-вывода, владельцем которого является пользователь "root", однако права доступа к которому на запись и чтение есть как у владельца, так и у группы. Его старший номер - 7, младший - 21. Процесс, открывающий файлы, получает доступ к устройству через таблицу ключей устройств ввода-вывода блоками и таблицу ключей устройств посимвольного ввода-вывода, соответственно, а младший номер устройства 21 информирует драйвер о том, к какому разделу диска производится обращение, например, дисковод 2, раздел 1. Поскольку младшие номера у файлов совпадают, они ссылаются на один и тот же раздел диска, если предположить, что это одно устройство (). Таким образом, процесс, выполняющий программу, открывает один и тот же драйвер дважды (используя различные интерфейсы), позиционирует головку к смещению с адресом 8192 и считывает данные с этого места. Результаты выполнения операций чтения должны быть идентичными при условии, что работает только одна файловая система.

#include "fcntl.h" main() { char buf1[4096], buf2[4096] int fd1, fd2, i;

if (((fd1 = open("/dev/dsk5/", O_RDONLY)) == -1) ((fd2 = open("/dev/rdsk5", O_RDONLY)) == -1)) { printf("ошибка при открытии\n"); exit(); }

lseek(fd1, 8192L, 0); lseek(fd2, 8192L, 0);

if ((read(fd1, buf1, sizeof(buf1)) == -1) (read(fd2, buf2, sizeof(buf2)) == -1)) { printf("ошибка при чтении\n"); exit(); }

for (i = 0; i < sizeof(buf1); i++) if (buf1[i] != buf2[i]) { printf("различие в смещении %d\n", i); exit(); } printf("данные совпадают\n"); }

<


Содержание  Назад  Вперед