Читайте также:
|
|
Когда SCM запускает сервисный процесс, тот немедленно вызывает StartServiceCtrlDispatcher. Эта функция принимает список точек входа в сервисы – по одной на каждый сервис процесса. Каждая точка входа идентифицируется именем соответствующего сервиса. Установив соединение с SCM по именованному каналу, функция StartServiceCtrlDispatcher входит в цикл ожидания команды запуска сервиса от SCM. SCM посылает команду запуска и функция StartServiceCtrlDispatcher, выйдя из цикла ожидания, создаёт поток сервиса (service thread). Поток вызывает точку входа в сервис и входит в цикл ожидания команд для сервиса. StartServiceCtrlDispatcher находится в бесконечном ожидании команд от SCM и возвращает управление основной функции процесса только после остановки всех сервисов в данном процессе. Это необходимо для обеспечения возможности освобождения занимаемых ресурсов.
При передаче управления на точку входа сервиса происходит вызов функции RegisterServiceCtrlHandler. Эта функция принимает и хранит указатель на функцию – обработчик управления (control service), которую реализует сервис для обработки различных команд SCM. Она не взаимодействует с SCM, а лишь хранит упомянутую функцию в локальной памяти процесса для функции StartServiceCtrlDispatcher. Точка входа продолжает инициализацию, выделяя необходимую память, создавая коммуникационный канал и считывая из реестра данные о собственной конфигурации сервиса. По соглашению эти параметры хранятся в разделе Параметры (Parameteres) раздела реестра для данного сервиса. Точка входа, инициализируя сервис, может периодически посылать SCM сообщения в ходе процесса запуска сервиса, используя функцию SetServiceStatus. Когда точка входа заканчивает инициализацию, поток сервиса обычно входит в цикл ожидания запросов от клиентских приложений. Например, Web-сервер должен инициализировать TCP-сокет и ждать запросы на входящие HTTP-соединения.
На рисунке показана схема внутренней организации сервисного процесса (рис.6):
1) StartServiceCtrlDispatcher запускает поток сервиса;
2) Поток сервиса регистрирует обработчик управления;
3) StartServiceCtrlDispatcher вызывает обработчик в ответ на команды SCM;
4) Поток сервиса обрабатывает клиентские запросы.
Рис.6. Процесс сервиса и его потоки
На рисунке показаны два потока процесса, созданных для одного сервиса: основной поток и поток сервиса.
SCM посылает сервису следующие команды: stop (стоп), pause (пауза), resume (возобновление), interrogate (опрос), shutdown (выключение) и команды, определяемые приложением.
Дата добавления: 2015-08-13; просмотров: 52 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Начало работы сервиса | | | Структура программы сервиса |