Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек СРВ от Анн.doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
2.26 Mб
Скачать

2. Относительные пути

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

Обратите внимание, что различия кончаются, когда ваш текущий рабочий каталог начинается с единственной наклонной чертой вправо или стартует с сетевого корня.

3. Текущий рабочий каталог

Если текущий рабочий каталог имеет ведущую двойную наклонную черту вправо (корень сети), он считается определенным и блокированным пространством указанного узла. Если вместо имеется единственная ведущая наклонная черта вправо, корень сети значения по умолчанию - связан.

Например, эта команда:

сd // 18/

является примером первой (определенной) формы, и блокировал бы будущую относительную оценку пути на узле 18, независимо оттого, что ваш корень сети значения по умолчанию изменится. Впоследствии ввод cd dev поместил бы Вас в // 18/dev.

С другой стороны, эта команда:

сd /

могла бы иметь вторую форму, где корень сети по умолчанию затронет относительную разрешающую способность пути. Например, если ваш корень сети значения по умолчанию был // 9, то ввод cd dev поместит Вас в // 9/dev. Потому что текущий рабочий каталог не начинается с отмены узла, корень сети значения по умолчанию - связан, чтобы создать полностью указанный сетевой путь.

Это действительно не как сложно, как может казаться. Обычно, сетевые корни (//node/) не определены, и все, что вы будете делать будет работой в пределах вашего пространства (определенного вашим сетевым корнем). Большинство вошедших пользователей примут сетевой корень по умолчанию (то есть пространство их собственного узла) и будут работать в пределах той среды.

Примечание относительно cd

В некоторых традиционных системах UNIX, команда cd (изменение каталога) изменяет путь, если имя пути содержит символические связи. В результате, путь нового текущего рабочего каталога — который Вы можете отобразить с помощью pwd — может отличиться от данного cd.

В QNX, однако, cd не изменяет имя пути — кроме свертывания, ссылки. Например:

сd /usr/home/luc/test/ . . / doc

привел бы к текущему рабочему каталогу /usr/home/luc/doc, даже если некоторые из элементов в пути были бы символическими связями.

Чтобы отобразить полностью определенный сетевой путь, Вы можете использовать fullpath утилиту.

4. Описатели файлов пространства

Как только ресурсs ввода - вывода открыт, различный пространства входят в игру. Open() возвращает целое число, упомянутое как дескриптор файла (FD), который используется, чтобы направить все дальнейшие запросы ввода - вывода к администратору.

Обратите внимание, что Sendfd() ядерный запрос используется в пределах библиотечных подпрограмм, чтобы направить запрос.

Описатели файлов пространства, в отличие от пути, является полностью локальным для каждого процесса. Администратор использует комбинацию PID и FD, чтобы идентифицировать управляющую структуру, связанную с предыдущим open(). Эта структура известна как открытый управляющий блок (OCB) и содержится в пределах администратора ввода - вывода.

Следующая диаграмма показывает администратор ввода - вывода, берущий некоторые PID, FD пары и отображающий их к OCB.

Открытый управляющий блок (OCB) содержит активную информацию относительно открытого ресурса. Например, файловая система сохраняет поток, ищут пункт(точку) в пределах файла здесь. Каждый open() создает новый OCB. Поэтому, если процесс открывает тот же самый файл дважды, любые запросы к lseek () использующий однин FD не будет затрагивать другого FD. Это справедливо для одних и тех же процессов, открывающих любой файл.

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

Несколько описателей файла в одном или нескольких процессах могут обратиться к одному OCB. Это достигается двумя средствами:

  • процесс может использовать dup(), dup2() или fcntl() функции C, чтобы дублировать описатель файла, который обращается к одному OCB.

  • когда новый процесс создан с помощью fork(), spawn(), или exec(), все описатели открытого файла по умолчанию наследуются новым процессом;

Эти наследованные описатели относятся к тому же самому OCB как соответствующие описатели файла в родительском процессе.

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

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

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

Вы можете предотвращать наследование описателя файла при использовании spawn() или exec(), вызывая fcntl() функцию и устанавливая флаг FD_CLOEXEC.