Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unix лекции / lection4.ppt
Скачиваний:
14
Добавлен:
20.04.2015
Размер:
340.99 Кб
Скачать

Конкурирующие процессы

Со стороны системы было бы несправедливо держать индекс заблокированным все время от момента, когда процесс открыл файл, и до того момента, когда файл будет закрыт этим процессом, поскольку тогда один процесс будет держать все время файл открытым, тем самым не давая другим процессам возможности обратиться к файлу.

Ядро снимает с индекса блокировку по окончании выполнения каждого вызова системной функции, использующей индекс.

write

number = write(fd,buffer,count)

fd – файловый дескриптор, полученный из open

buffer – адрес структуры данных

count – количество байт, которые нужно записать

number – реально записанные байты

write

Алгоритм записи в обычный файл похож на алгоритм чтения из обычного файла.

Если в файле отсутствует блок, соответствующий смещению

вбайтах до места, куда должна производиться запись, ядро выделяет блок, используя алгоритм alloc, и присваивает ему номер в соответствии с точным указанием места в таблице содержимого индекса.

Индекс блокируется на все время выполнения функции write, так как ядро может изменить индекс, выделяя новые блоки; разрешение другим процессам обращаться к файлу может разрушить индекс, если несколько процессов выделяют блоки одновременно, используя одни и те же значения смещений.

Когда запись завершается, ядро корректирует размер файла

виндексе, если файл увеличился

Указание позиции в файле, где будет выполняться ввод-вывод

position = lseek(fd,offset,reference);

fd – файловый дескриптор, полученный из open offset – смещение в байтах

reference – указывает, является ли смещение от начала файла, от текущей позиции или от конца файла

Значение смещения указывается в таблице файлов.

close(fd)

Close

Ядро выполняет операцию закрытия, используя дескриптор файла и информацию из соответствующих записей в таблице файлов и таблице индексов.

Если счетчик ссылок в записи таблицы файлов имеет значение, большее, чем 1, то это означает, что на запись в таблице файлов делают ссылку другие пользовательские дескрипторы

Ядро уменьшает значение счетчика и операция закрытия завершается. Если счетчик ссылок в таблице файлов имеет значение, равное 1, ядро освобождает запись в таблице и индекс в памяти, ранее выделенный системной функцией open.

Когда процесс завершается, ядро проверяет наличие активных пользовательских дескрипторов файла, принадлежавших процессу, и закрывает каждый из них.

creat

fd = creat(pathname,modes)

Ядро ищет в каталоге файл с заданным именем

Ядро отмечает смещение в байтах до первой пустой позиции в каталоге и запоминает это смещение в пространстве процесса

Ядро также запоминает в пространстве процесса индекс

просматриваемого каталога и держит индекс заблокированным

Ядро проверяет наличие у процесса разрешения на запись в каталог

Ядро назначает новому файлу индекс

Записывает имя нового файла и номер вновь выделенного индекса в родительский каталог, освобождает родительский каталог

Ядро записывает вновь выделенный индекс на диск, прежде чем записать на диск каталог с новым именем

mknod – создание спецфайлов

mknod(pathname,type and permissions,dev)

pathname – имя

type and permissions – тип вершины (каталог, канал, файл устройств) и права доступа к файлу

dev – старший и младший номера устройств

Процесс запоминает индекс нового каталога

chdir(pathname); смена каталога chroot(pathname); смена корневого каталога

Смена владельца или прав доступа является операцией, производимой над

индексом

chown(pathname,owner,group)

chmod(pathname,mode)

stat(pathname,statbuffer);

fstat(fd,statbuffer);

Системные функции stat и fstat позволяют процессам запрашивать информацию о статусе файла: типе файла, владельце файла, правах доступа, размере файла, числе связей, номере индекса и времени доступа к файлу

Соседние файлы в папке Unix лекции