Системная функция mknod создает в системе специальные файлы, в число которых включаются поименованные каналы, файлы устройств и каталоги. Она похожа на функцию creat в том, что ядро выделяет для файла индекс. Синтаксис вызова системной функции mknod:
mknod(pathname,type and permissions,dev)
где pathname - имя создаваемой вершины в иерархической структуре файловой системы, type and permissions - тип вершины (например, каталог) и права доступа к создаваемому файлу, а dev указывает старший и младший номера устройства для блочных и символьных специальных файлов (глава 10). На Рисунке 5.13 приведен алгоритм, реализуемый функцией mknod при создании новой вершины.
алгоритм создания новой вершины
входная информация: вершина (имя файла)
тип файла
права доступа
старший, младший номера устройства
(для блочных и символьных специальных
файлов)
выходная информация: отсутствует
{
если (новая вершина не является поименованным каналом
и пользователь не является суперпользователем)
возвратить (ошибку);
получить индекс вершины, являющейся родительской для
новой вершины (алгоритм namei);
если (новая вершина уже существует)
{
освободить родительский индекс (алгоритм iput);
возвратить (ошибку);
}
назначить для новой вершины свободный индекс из файловой
системы (алгоритм ialloc);
создать новую запись в родительском каталоге: включить
имя новой вершины и номер вновь назначенного индекса;
освободить индекс родительского каталога (алгоритм
iput);
если (новая вершина является блочным или символьным спе-
циальным файлом)
записать старший и младший номера в структуру индек-
са;
освободить индекс новой вершины (алгоритм iput);
}
|
Ядро просматривает файловую систему в поисках имени файла, который оно собирается создать. Если файл еще пока не существует, ядро назначает ему новый индекс на диске и записывает имя нового файла и номер индекса в родительский каталог. Оно устанавливает значение поля типа файла в индексе, указывая, что файл является каналом, каталогом или специальным файлом. Наконец, если файл является специальным файлом устройства блочного или символьного типа, ядро записывает в индекс старший и младший номера устройства. Если функция mknod создает каталог, он будет существовать по завершении выполнения функции, но его содержимое будет иметь неверный формат (в каталоге будут отсутствовать записи с именами "." и ".."). В упражнении 5.33 рассматриваются шаги, необходимые для преобразования содержимого каталога в правильный формат.
алгоритм смены каталога
входная информация: имя нового каталога
выходная информация: отсутствует
{
получить индекс для каталога с новым именем (алгоритм
namei);
если (индекс не является индексом каталога или же про-
цессу не разрешен доступ к файлу)
{
освободить индекс (алгоритм iput);
возвратить (ошибку);
}
снять блокировку с индекса;
освободить индекс прежнего текущего каталога (алгоритм
iput);
поместить новый индекс в позицию для текущего каталога
в пространстве процесса;
}
|