
- •Глава 8
- •В.Г.Олифер, н.А.Олифер. Сетевые операционные системы. Учебное пособие.-сПб.:бхв-Петербург, 2006.-536с.
- •В.А.Шеховцов. Операційні системи. Підручник .-к.:Виканавча група внv. 2005. 576с.
- •Столлингс в. Операционные системы. М.: Вильямс, 2001. -672с.
- •Раздел 8 Взаимодействие с пользователем в операционных системах
- •8.1. Терминальный ввод-вывод
- •8.1.1. Организация терминального ввода-вывода
- •8.1.2. Терминальное ввод-вывод в unix и Linux
- •8.1.3. Терминальный ввод-вывод в Win32 арi
- •8.2. Командный интерфейс пользователя
- •8.2.1. Принципы работы командного интерпретатора
- •8.2.2. Перераспределение потоков ввода-вывода
- •8.3. Графический интерфейс пользователя
- •8.3.1. Интерфейс оконной и графической подсистемы Windows хр
- •Int winapi Winmain hinstance ih. Hinstance tp.
- •Int X. Int y. Int width, int height. Hwnd ph. Hmenu mh.
- •8.3.2. Система X Window
- •17.4. Процессы без взаимодействия с пользователем
- •17.4.1. Фоновые процессы на основе posix
- •17.4.2. Службы Windows xp
- •Void maino {
- •Void winapi svc_main(dword argc. Lptstr argv[]){
- •Void winapi svc_ctrlhandler(dword ctl) {
- •If (Ctl - Service_control_st0p) {
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, которое проверяют в основной функции службы.