Главный поток сервера ничего не делает
22-24 Главный поток сервера блокируется при вызове pause. Вся функциональность обеспечивается функцией servproc, которая будет запускаться как отдельный поток каждый раз при получении запроса клиента.
Запустим сервер в отдельном окне:
solaris % server1 /tmp/server1
После этого запустим пpoгрaммy-клиeнт в другом окне, указав в качестве аргумента то же полное имя, которое было указано при вызове сервера:
solaris % client1 /tmp/server19
result: 81
solaris % ls -l /tmp/server1
Drw-r-r– 1 rstevens other1 0 Apr 9 10:09 /tmp/server1
Мы получили ожидаемый результат. Вызвав ls, мы видим, что эта пpoгрaммa выводит букву D в начале строки, соответствующей файлу, указывая, что этот файл является дверью.
На рис. 15.2 приведена диaгрaммa работы данного примера. Функция door_call вызывает процедуру на сервере, которая затем вызывает door_return для возврата.
На рис. 15.3 приведена диaгрaммa, показывающая, что в действительности происходит при вызове процедуры в другом процессе на том же узле.
Рис. 15.2. Внешний вид вызова процедуры в другом процессе
На рис. 15.3 выполняются следующие действия:
0. Запускается сервер, вызывает door_create, чтобы создать дескриптор для функции servproc, затем связывает этот дескриптор с именем файла в файловой системе.
1. Запускается клиент и вызывает door_call. Это функция в библиотеке дверей.
2. Библиотечная функция door_call делает системный вызов. При этом указывается процедура, которая должна быть выполнена, а управление передается функции из библиотеки дверей процесса-сервера.
3. Вызывается процедура сервера (servproc в данном примере).
4. Процедура сервера делает все необходимое для обработки запроса клиента и вызывает door_return по завершении работы.
5. Библиотечная функция door_return осуществляет системный вызов, передавая управление ядру.
6. В этом вызове указывается процесс-клиент, которому и передается управление.
Рис. 15.3. Что в действительности происходит при вызове процедуры в другом процессе
Последующие разделы этой главы описывают интерфейс дверей (doors API) более подробно, с множеством примеров. В приложении А мы убедимся, что двери представляют собой наиболее быструю форму IPC (при измерении времени ожидания).