Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
02.05.2014
Размер:
1.46 Mб
Скачать

Каталог файловой системы ffs

Структура каталога файловой системы FFS была изменена для поддержки длинных имен файлов (до 255 символов). Вместо записей фиксированной длины запись каталога FFS представлена структурой, имеющий следующие поля:

d_ino номер индексного десриптора

d_reclen длина записи

d_namlen длина имени файла

d_name имя файла

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

Архитектура виртуальной файловой системы

Современные версии UNIX обеспечивают одновременную работу с несколькими типами файловых систем, существенно отличающимися по внутренней архитектуре. Среди них можно выделить локальные файловые системы различной архитектуры, удаленные и даже отличные от файловой системы UNIX, например, DOS. Такое существование обеспечивается путем разделения каждой файловой системы на зависимый и не зависимый от реализации уровни. Независимый уровень является общим и представляет для остальных подсистем ядра некоторую абстрактную файловую систему. Независимый уровень также называется виртуальной файловой системой. При этом дополнительные файловые системы различных типов могут быть встроены в ядро UNIX подобно драйверам устройств.

Виртуальные инднексные дискрипторы

Дисковый файл обычно имеет связанную с ним структуру данных, называемую метаданными или индексным дескриптором, где хранятся основные характеристики данного файла и с помощью которой обеспечивается доступ к его данным. Одним из исключений из этого правила является файловая система DOS, в которой структуры файла и его метаданных существенно отличаются от принятых в UNIX. Тем не мене VFS основана на представлении метаданных файла в виде сходной с традиционным для UNIX. Интерфейсом работы с файлами являются с v node – внутренний индексный дескриптор.

Структура данных v node одинакова для всех файлов, независимо от типа реальной файловой системы, где фактически располагается файл. Данные v node содержат информацию, необходимую для работы VFS, а также неизменные характеристики файла.

Каждый виртуальный индекс дескриптор содержит число ссылок, которое увеличивается при открытии процессом файла и уменьшается при его закрытии. Когда число ссылок становится равным 0,вызывается операция vn_inactive, которая сообщает реальной файловой системе, что на виртуальный индексный дескриптор никто больше не ссылается. После этого файловая система может освободить виртуальный индексный дескриптор или поместить его в каталог для дальнейшего использования.

Командный интерпретатор Shell.

Все совмещенные системы составляются по крайней мере с тремя командными интерпретаторами. Bourne shell (sh), c shell (csh) koru shell (ksh), существует еще несколько интерпретаторов например Bourn – Again shell (bash), со сходными функциями.

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

  1. При включении терминала активизируется процесс getty, который является сервером терминального доступа и запускает программу begin, которая, в свою очередь запрашивает у пользователя имя и пароль.

  2. если пользователь зарегестрирован в системе и ввел правильный пароль, begin запустит программу, указанную в последнем поле записи пользователя в файле /etc/passwd. В принципе это может быть любая программа, но обычно это командный интерпретатор shell.

  3. Shell выполняет соответствующий командный файл инициализации и выдает на терминал пользователя приглашение. С этого момента и пользователь может вводить команды.

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

  5. По окончании работы пользователь завершает работу с интерпритатором, вводя команду exit, и выходит из системы.

Командный интерпритатор является удобным средством программирования.

С помощью Shell можно создавать сложные программы, конструируя их как из кирпичиков, из существующих утилит UNIX. Программы на языке Shell часто называют скриптами или сценариями (script). Интерпритатор считывает строки из файла - скрипта и выполняет их, как если бы они были введены пользователем в командной строке.

Как уже упоминалось, при входе пользователя в систему запускается его инициализационный скрипт, выполняющий несколько функций: установку пути поиска программ, инициализацию терминала, определение расположения почтового ящика. Помимо этого может быть выполнен целый ряд полезных действий, - например, установка приглашения.

Инициализационный скрипт находится в домашнем каталоге пользователя.

Для разных командных интерпретаторов используются различные скрипты инициализации:

Bourn Shell(sh) .profail

C Shell (csh) . login cshre

Korn Shell .profile Kshrc

Boupn Again Shell .profile bashre

Скрипты profile и login выполняются при первом входе в систему. Скрипы cshre, Kshrc и bashrc выполняются при каждом запуске интерпретатора.

Синтаксис языка Shell.

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

В Бурновском интерпретаторе (Bourne Shell) комментарии начинаются с символа #; комментарии могут занимать не всю строку, а следовать после команды.

Поскольку в системе могут существовать скрипты для различных интерпретаторов, имя интерпретирующей команды обычно помещается в первой строке следующим образом:

#! /bin/sh – здесь последующий текст скрипта будет интерпретироваться Bourne Shell

В командной строке или скрипте командного интерпретатора можно определить и использовать переменные. Значением переменной является строка, которая передается присвоением:

var = value, где var – имя переменной, а value – ее значение.

Значение переменной можно получить используя знак '$'. Например, вывести значение переменной name на экран можно с помощью команды echo следующим образом:

$ tcho $ name

Так же можно присвоить другой переменной name 1 значение переменной name

$ name 1= $ name

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

Синтаксис представления при этом следующий:

var = 'command'

Здесь var – имя переменной, а command – название команды.

Пример:

команда pwd выводит строку со значением текущего каталога

$ pwd

/usr/home/student

Можно присвоить переменной cdir значение текущего каталога, которое сохраняется в ней:

$ cdir = 'pwd'

$ echo $cdir

/usr/home/student

$ cd/usr/bin

$ pwd

/usr/bin

$ cd $ cdir

$ pwd

/usr/home/student

При использовании переменной, например var, командный интерпретатор подставляет вместо $ var ее значение. Более сложные синтаксические конструкции получения значения переменной следующие:

$ var

- значение var; ничего, если var не определена

$ {var}

- тоже, но отделяет имя переменной var от последующих символов.

$ {var: - string}

- значение var если определено; иначе -string

$ {var:=string}

-тоже, но если var не определена, ей присваивается значение строки string

$ {var: ? string}

-если var не определена выводится строка string и shell прекращает работу.

$ {var: + string}

- Строка string, если var определена, в противном случае ничего

несколько примеров:

$ var = user 1

$ var 1 = user 2

$ echo $ var 1

user 2

$ echo ${var}1

user 11

$ echo $ {var 1:+ "hello"}

hello

Для нормальной работы UNIX ряд переменных должен быть определен. Некоторые наиболее употребительные переменные:

HOME

каталог верхнего уровня пользователя

/usr/student

PATH

Поисковый путь

/bin:/etc:/usr/bin:.

MAIL

имя почтового ящика

/usr/spool/mail/student

TERM

имя терминала

ttpi

PS1

первичное применение shell

#

PS2

вторичное применение shel

>

Переменная HOME в основном используется в команде cd, которая служит для перехода в каталог.

Вызов команды cd без параметра эквивалента следующему вызову:

$ cd $ HOME

который вернет систему в домашний каталог.

Переменная PATH служит для поиска командным интерпретатором запущенных на выполнение программ, если их имя не содержит пути.

Каталоги поиска в переменной PATH разделены символом ':'. Текущий каталог поиска должен быть задан явно ' . ', shell не производит поиск в текущем каталоге по умолчанию.

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

Переменная TERM содержит имя терминала и используется программами для доступа к базе данных терминалов. Обычно это программы, обеспечивающие полноэкранный режим работы, цвета и системы меню (редакторы, различные пользовательские оболочки).

Переменные PS1 и PS2 устанавливают первичное и вторичное приглашение командного интерпретатора. Первичное приглашение указывает на готовность интерпретатора к вводу команд. Значение этой переменной имеет вид "$" для обычных пользователей и "#" для суперпользователя. Однако вид приглашения легко изменит, задав значение переменной PS1. Чтобы задать в приглашении домашней директории:

PS1 = 'home' " > "

тогда приглашение компьютера будет

Home\student >

Вторичное приглашение появляется, если нажать клавишу <Enter>, синтаксически не закончив ввод команды.

$while:

>do

>echo Привет!

>done

После этого слово "Привет", будет выводиться в бесконечном цикле. Выйти из этого можно <Ctrl>+<C> или <Del>.

Помимо переменных, определяемых явно, Shell имеет ряд внутренних переменных, значения которых устанавливаются самим интерпретатором.

$1, $2,…

$#, $?, $$,$!, $*, $@

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

Соседние файлы в папке Операционные системы