Администратор процессов принимает запрос и просматривает дерево имен на предмет соответствия (давайте предположим здесь, что нам необходимо точное соответствие). Имя пути «/dev/ser1
» вполне подойдет, и администратор процессов может ответить клиенту: «Нашел /dev/ser1
. За обработку отвечает канал 1 процесса 44 на узле 0, спроси его!»
Не забывайте: мы все еще в клиентском коде
Функция
Сообщение _IO_CONNECT.
Затем, наконец, клиентская функция
На самом деле этот дескриптор файла представляет собой идентификатор соединения, который мы только что использовали для отправки сообщения администратору ресурса! Если бы администратор ресурса
Поиск администратора процессов
Теперь, когда мы знаем основные этапы поиска конкретного администратора ресурса, осталось раскрыть тайну поиска администратора процесса, с которого все начинается. На самом деле все очень просто. По определению, администратору процессов соответствует дескриптор узла 0 (то есть текущий узел), идентификатором процесса 1 и идентификатор канала 1. Так что администратор процессов всегда идентифицируется триплетом ND/PID/CHID, равным 0/1/1.
Обработка каталогов
Пример, рассмотренный выше, относился к администратору последовательного порта. Мы также высказывали предположение, что хотим точного соответствия имен путей при поиске по дереву. Это предположение справедливо только наполовину — все соответствия имен путей, о которых мы будем говорить в этой главе, основаны на
Предположим, у меня есть код, который делает следующее:
fp = fopen("/etc/passwd", "r");
Напомним, что функция /etc/passwd
. Но такого имени на рисунке нет:
Пространство имен путей в QNX/Neutrino.
Однако, из рисунка видно, что модуль fs-qnx4
зарегистрировал свою тройку ND/PID/CHID для имени пути «/
». Хоть это и не показано на рисунке, файловая система fs-qnx4
зарегистрировалась как «/
» и все то, что расположено «ниже». «fs-qnx4
получает возможность обработать запрос для имени пути «/etc/passwd
», потому что это имя начинается с «/
», а значит, есть совпадение!
А что произошло бы, если бы мы попытались сделать так?
fd = open("/dev/ser1/9600.8.1.n", O_WRONLY);
Ну, поскольку у администратора последовательного порта не установлен флаг каталога, администратор процессов увидит эта и скажет: «Опаньки, извините, /dev/ser1
— не каталог. В обработке отказано». Запрос прямо здесь и заканчивается — администратор процессов даже не возвращает функции