FFL
1.0
Finfly Foundation Library
|
Базовая служба. Подробнее...
Классы | |
class | console |
Контекст запуска как консольного приложения. Подробнее... | |
class | context |
Контекст выполнения службы. Подробнее... | |
class | scm |
Контекст запуска c SCM. Подробнее... | |
Открытые типы | |
enum | type { FILE_SYSTEM_DRIVER = SERVICE_FILE_SYSTEM_DRIVER, KERNEL_DRIVER = SERVICE_KERNEL_DRIVER, WIN32_OWN_PROCESS = SERVICE_WIN32_OWN_PROCESS, WIN32_SHARE_PROCESS = SERVICE_WIN32_SHARE_PROCESS } |
Тип службы. Подробнее... | |
enum | status { CONTINUE_PENDING = SERVICE_CONTINUE_PENDING, PAUSE_PENDING = SERVICE_PAUSE_PENDING, PAUSED = SERVICE_PAUSED, RUNNING = SERVICE_RUNNING, START_PENDING = SERVICE_START_PENDING, STOP_PENDING = SERVICE_STOP_PENDING, STOPPED = SERVICE_STOPPED } |
Состояние службы. Подробнее... | |
enum | accept { NOTHING = 0, NETBINDCHANGE = SERVICE_ACCEPT_NETBINDCHANGE, PARAMCHANGE = SERVICE_ACCEPT_PARAMCHANGE, PAUSE_CONTINUE = SERVICE_ACCEPT_PAUSE_CONTINUE, SHUTDOWN = SERVICE_ACCEPT_SHUTDOWN, STOP = SERVICE_ACCEPT_STOP, HARDWAREPROFILECHANGE = SERVICE_ACCEPT_HARDWAREPROFILECHANGE, POWEREVENT = SERVICE_ACCEPT_POWEREVENT } |
Обрабатываемая команда. Подробнее... | |
Открытые члены | |
service (context &_c) throw () | |
virtual void | stop () throw () |
Обработать команду на остановку службы. | |
Открытые статические члены | |
static const char * | spell (type _type) throw () |
Получить текстовое представление типа службы. | |
static const char * | spell (status _status) throw () |
Защищенные данные | |
context & | Context |
Базовая служба.
Служба - это поток, который выполняется в фоновом режиме и управляется посредством диспетчера управления службами (Service Control Manager - SCM). Служба выполняется в рамках своего родительского процесса и использует данные этого процесса. Процесс может содержать одну или несколько служб.
Базовая служба - это абстрактный класс, который реализует интерфейс службы с SCM и является основой для создания служб. Базовая служба должна иметь метод service::run, который содержит исполняемый код службы. Аргументы этого метода аналогичны аргументам функции main. При запуске службы из SCM нулевой аргумент содержит имя службы.
При запуске службы SCM сначала запускает процесс службы (если он еще не запущен), а затем передает процессу команды на запуск отдельных служб. Для того, что бы процесс мог взаимодействовать с SCM по запуску служб, он должен иметь специальную точку входа. Для объявления точки входа процесса, который может запускать единственную службу используется макрос FFL_CSSC_SERVICE.
Процесс с единственной службой может быть определен следующим образом:
class myservice:public service { void run(int _argc, const char* _argv[]) throw() { ... } }; FFL_CSSC_SERVICE(myservice, "MyService");
В ходе выполнения служба проходит ряд состояний (service::status). Служба должна сообщать о своем состоянии и об изменении состояний SCM, отправляя соответствующие сообщения. Служба отправляет сообщения SCM, используя контекст выполнения службы (service::context).
Типичная последовательность состояний службы показана на следующем рисунке.
Состояние service::RUNNING, service::STOPPED, service::PAUSED являются основаными состояниями службы. В каждом из этих состояний службы может находиться произвольное время. Состояние service::RUNNING - это основное состояние, в котором служба выполняет свои основные функции. Состояния service::START_PENDING, service::PAUSE_PENDING, service::CONTINUE_PENDING, service::STOP_PENDING являются переходными состояниями и соответветствуют переходам из одного основного состояния в другое. Служба находится в переходном состоянии обычно непродолжительное время, и в это время основные функции службы не выполняются (обычно в это время происходит выделение или освобождение ресурсов, необходимых службе).
Для того чтобы SCM мог управлять службой (запускать, останавливать службу, отображать состояние службы) служба должна быть зарегистрирована в реестре SCM. Для регистрации службы, а также для управления службой используется системная команда sc (для выполнения этой команды требуется запуск командной консоли от имени администратора). Далее приведены примеры команд SCM для управления службами.
Создание службы в реестре SCM (процесс с единственной службой, служба запускается по требованию):
sc create <Идентификатор службы> binPath= <Путь к исполняемому файлу> displayname= <Развернутое описание службы>
Вывод параметров службы (контроль записи в реестре SCM):
sc qc <Идентификатор службы>
Запуск службы:
sc start <Идентификатор службы> <аргумент 1> <аргумент 2> ...
Вывод текущего состояния службы:
sc query <Идентификатор службы>
Удаление службы из реестра SCM:
sc delete <Идентификатор службы>
Обрабатываемая команда.
const char * service::spell | ( | type | _type | ) | throw () [static] |
Получить текстовое представление типа службы.
[in] | _type | Тип службы. |
virtual void ffl::cssc::service::stop | ( | ) | throw () [inline, virtual] |
Обработать команду на остановку службы.
Метод вызывается контекстом запуска службы если получена команда на остав службы. Метод в классе наследнике должен инициировать прекращение работы службы. Если выполнение службы может быть завершено немедленно, то служба переходит в состояние status::STOPPED. Если для завершения службы требуется время, то службы должна быть переведена в переходное состояние status::STOP_PENDING.
Переопределяется в ffl::cssc::multithreaded::service.