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

         

UNLINК


Системная функция unlink удаляет из каталога точку входа для файла. Синтаксис вызова функции unlink: unlink(pathname);

где pathname указывает имя файла, удаляемое из иерархии каталогов. Если процесс разрывает данную связь файла с каталогом при помощи функции unlink, по указанному в вызове функции имени файл не будет доступен, пока в каталоге не создана еще одна запись с этим именем. Например, при выполнении следующего фрагмента программы: unlink("myfile"); fd = open("myfile",O_RDONLY);

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


Рисунок 5.30. Взаимная блокировка процессов при выполнении функции link

На представлен алгоритм функции unlink. Сначала для поиска файла с удаляемой связью ядро использует модификацию алгоритма namei, которая вместо индекса файла возвращает индекс родительского каталога. Ядро обращается к индексу файла в памяти, используя алгоритм iget. (Особый случай, связанный с удалением имени файла ".", будет рассмотрен в упражнении). После проверки отсутствия ошибок и (для исполняемых файлов) удаления из таблицы областей записей с неактивным разделяемым текстом () ядро стирает имя файла из родительского каталога: сделать значение номера индекса равным 0 достаточно для очистки места, занимаемого именем файла в каталоге. Затем ядро производит синхронную запись каталога на диск, гарантируя тем самым, что под своим прежним именем файл уже не будет доступен, уменьшает значение счетчика связей и с помощью алгоритма iput освобождает в памяти индексы родительского каталога и файла с удаляемой связью.

При освобождении в памяти по алгоритму iput индекса файла с удаляемой связью, если значения счетчика ссылок и счетчика связей становятся равными 0, ядро забирает у файла обратно дисковые блоки, которые он занимал. На этот индекс больше не указывает ни одно из файловых имен и индекс неактивен. Для того, чтобы забрать дисковые блоки, ядро в цикле просматривает таблицу содержимого индекса, освобождая все блоки прямой адресации немедленно (в соответствии с алгоритмом free). Что касается блоков косвенной адресации, ядро освобождает все блоки, появляющиеся на различных уровнях косвенности, рекурсивно, причем в первую очередь освобождаются блоки с меньшим уровнем. Оно обнуляет номера блоков в таблице содержимого индекса и устанавливает размер файла в индексе равным 0. Затем ядро очищает в индексе поле типа файла, указывая тем самым, что индекс свободен, и освобождает индекс по алгоритму ifree. Ядро делает необходимую коррекцию на диске, так как дисковая копия индекса все еще указывает на то, что индекс используется; теперь индекс свободен для назначения другим файлам.


алгоритм unlink входная информация: имя файла выходная информация: отсутствует { получить родительский индекс для файла с удаляемой связью (алгоритм namei); /* если в качестве файла выступает текущий каталог... */ если (последней компонентой имени файла является ".") увеличить значение счетчика ссылок в индексе; в противном случае получить индекс для файла с удаляемой связью (алго- ритм iget); если (файл является каталогом, но пользователь не явля- ется суперпользователем) { освободить индексы (алгоритм iput); возвратить (ошибку); } если (файл имеет разделяемый текст и текущее значение счетчика связей равно 1) удалить записи из таблицы областей; в родительском каталоге: обнулить номер индекса для уда- ляемой связи; освободить индекс родительского каталога (алгоритм iput); уменьшить число связей файла; освободить индекс файла (алгоритм iput); /* iput проверяет, равно ли число связей 0, если * да, * освобождает блоки файла (алгоритм free) и * освобождает индекс (алгоритм ifree); */ }
Рисунок 5.31. Алгоритм удаления связи файла с каталогом


Содержание раздела