Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гл.8 ОС буклет.doc
Скачиваний:
5
Добавлен:
11.11.2018
Размер:
286.21 Кб
Скачать

Void maino {

SERVICE_TABLE_ENTRY disp_table[] =

{{"mysvc".svc_main}.{NULL.NULL}:

StartServiceCtrLDispatcher(disp_table); }

Главная функция службы

Главную функцию службы вызывают во время запуска службы (в результате выполнения StartServiceCtrLDispatcher()) и выполняют к ее остановке. ее код реализует основную функциональность службы (ожидает соединений от клиентов, выполняет запросы и тому подобное). Определение этой функции имеет такой вид:

Void winapi svc_main(dword argc. Lptstr argv[]){

// код основной функции службы

}

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

dwServiceType - тип службы (SERVICE_WIN32_OWN_PR0CESS для обычных служб, которые выполняются в отдельном процессе);

dwCurrentState - текущее состояние службы (в этот момент она ожидает начала выполнения, и этот параметр возлагают ровными SERVICE_START_PENDING);

dwControlsAccepted - допустимые управляющие команды, которые входят в функцию-обработчик команд (SERVICE_ACCEPT_STOP значит, что будет обрабатываться только команда Stop).

Заполнение структуры SERVICE_STATUS выполняется так:

status.dwServiceType = SERVICE_WIN32_OWN_PR0CESS:

status.dwCurrentState = SERVICE_START_PENDING:

status.dwControlsAccepted - SERVICE_ACCEPT_STOP;

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

sth = RegisterServiceCtrLHandler("mysvc",svc_ctrlhandler);

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

На этом подготовительный этап завершают. Теперь можно инициализировать службу (создать сетевые соединения, подготовить внутренние структуры данных и тому подобное). После этого службу переводят в состояние выполнения, для чего задают новое значение поля dwCurrentState для структуры SERVICE_STATUS и вызывают функцию SetServiceStatus(), первым параметром которой является глобальный дескриптор статуса службы, а вторым - указатель на структуру SERVICE_STATUS.

// ... инициализация службы

status.dwCurrentState - Service_running;

SetServiceStatus (sth. Sstatus):

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

while (running) {

// ... работа службы

}

В данном случае переменная runni ng асинхронный будет изменяться в обработчики команд управления.

Обработчик команд управления

Функцию-обработчик команд управления вызывают асинхронной в случае получения службой такой команды (например, с помощью окна управления службами или утилиты net. exe). Эта функция похожа обработчик сигналов в UNIX или обработчик консольных команд Windows XP. Она должна принимать один параметр, который отображает команду управления, и выполнять действия в зависимости от значения этой команды.

В приведенном примере эта функция обрабатывает только команду Stop Service (SERVICE_CONTROL_ST0P); но можно обрабатывать и другие команды, например Pause/continue или Shutdown, которую подают в случае прекращения работы ОС.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]