Пример:команднаяоболочкауправленияслужбами
Пример:команднаяоболочкауправленияслужбами
Управление службами часто осуществляется посредством утилит, входящих в группу Administrative Tools, доступ к которым открывается через пиктограмму Services (Службы). Для управления пользовательскими службами можно также использовать оболочку ServiceShell (программа 13.3), представляющую собой видоизмененный вариант программы JobShell из главы 6 (программа 6.3).
Программа 13.3. ServiceShell: программа управления службами
/* Глава 13. */
/* ServiceShell.с. Программа командной оболочки управления службами Windows.
Эта программа является видоизмененным вариантом программы управления задачами из главы 6, но только управляет службами, а не задачами. */
/* Поддерживаемые команды:
create — создание службы
delete – удаление службы
start – запуск службы
control – управление службой */
#include "EvryThng.h"
static SC_HANDLE hScm;
static BOOL Debug;
int _tmain(int argc, LPTSTR argv[]) {
BOOL Exit = FALSE;
TCHAR Command[MAX_COMMAND_LINE + 10], *pc;
DWORD i, LocArgc; /* Локальный параметр argc. */
TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];
LPTSTR pArgs[MAX_ARG];
/* Подготовить локальный массив "argv" в виде указателей на строки. */
for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];
/* Открыть диспетчер управления службами на локальной машине. */
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
/* Главный цикл обработки команд. */
_tprintf(_T(" Управление службами Windows Services"));
while (!Exit) {
_tprintf(_T (" SM$"));
_fgetts(Command, MAX_COMMAND_LINE, stdin);
… Как для JobShell …
if (_tcscmp(argstr [0], _T("create")) == 0) {
Create(LocArgc, pArgs, Command);
}
… Аналогичным образом для всех команд …
}
CloseServiceHandle(hScm);
return 0;
}
int Create(int argc, LPTSTR argv[], LPTSTR Command) {
/* Создание новой службы в виде службы, запускаемой "по требованию":
argv[1]: имя службы
argv[2]: отображаемое имя службы
argv[3]: название исполняемого файла */
SC_HANDLE hSc;
TCHAR CurrentDir[MAX_PATH +1], Executable[MAX_PATH + 1];
hSc = CreateService(hScm, argv[1], argv[2], SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Executable, NULL, NULL, NULL, NULL, NULL);
return 0;
}
/* Удаление службы – argv [1]: имя удаляемой службы. */
int Delete(int argc, LPTSTR argv[], LPTSTR Command) {
SC_HANDLE hSc;
hSc = OpenService(hScm, argv[1], DELETE);
DeleteService(hSc);
CloseServiceHandle(hSc);
return 0;
}
/* Запуск именованной службы - argv [1] : имя запускаемой службы. */
int Start(int argc, LPTSTR argv[], LPTSTR Command) {
SC_HANDLE hSc;
TCHAR WorkingDir[MAX_PATH + 1];
LPTSTR pWorkingDir = WorkingDir;
LPTSTR argvStart[] = {argv[1], WorkingDir};
GetCurrentDirectory(MAX_PATH + 1, WorkingDir);
hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);
/* Запустить службу с одним аргументом — именем рабочего каталога. */
/* Примечание: по умолчанию имя службы совпадает с именем, */
/* связанным с дескриптором hSc посредством функции OpenService. */
/* Вместе с тем, функция ServiceMain это не проверяет. */
StartService(hSc, 2, argvStart);
CloseServiceHandle(hSc);
return 0;
}
/* Управление именованной службой.
argv[1]: имя управляемой службы.
argv[2]: управляющая команда: stop (остановка), pause (пауза), resume (возобновление), interrogate (опрос). */
static LPCTSTR Commands[] = {"stop," "pause," "resume," "interrogate," "user"};
static DWORD Controls[] = {
SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,
SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128
};
int Control(int argc, LPTSTR argv[], LPTSTR Command) {
SC_HANDLE hSc;
SERVICE_STATUS ServiceStatus;
DWORD dwControl, i;
BOOL Found = FALSE;
for (i= 0; i < sizeof(Controls)/sizeof(DWORD) && !Found; i++) Found = (_tcscmp(Commands [i], argv[2]) == 0);
if (!Found) {
_tprintf(_T(" Несуществующая команда управления %s"), argv[1]);
return 1;
}
dwControl = Controls[i – 1];
hSc = OpenService(hScm, argv[1], SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL | SERVICE_QUERY_STATUS);
ControlService(hSc, dwControl, &ServiceStatus);
if (dwControl == SERVICE_CONTROL_INTERROGATE) {
QueryServiceStatus (hSc, &ServiceStatus);
printf(_T("Состояние, полученное при помощи QueryServiceStatus "));
printf(_T("Состояние службы "));
… Вывести всю остальную информацию о состоянии …
}
if (hSc != NULL) CloseServiceHandle(hSc);
return 0;
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
25.5. Пример
25.5. Пример Для закрепления материала этой главы ниже приводится пример приложения, в котором задействовано большинство функциональных возможностей qdbm. Подразумевается, что в результате выполнения этого приложения будет создана простая база данных телефонных номеров,
27.1.1. Пример
27.1.1. Пример В главе 8 был представлен пример использования обычной разделяемой библиотеки. Библиотеку libhello.so, которую нам удалось создать, можно загружать во время выполнения. Программа loadhello загружает libhello.so динамически и вызывает функцию print_hello, которая находится в
Пример
Пример В листинге 11.1[1] показана простая программа, вызывающая функцию gethostbyname для любого числа аргументов командной строки и выводящая всю возвращаемую информацию.Листинг 11.1. Вызов функции и вывод возвращаемой информации//names/hostent.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 char
Пример
Пример Сначала приведем пример с Ipv4:freebsd % traceroute www.unpbook.comtraceroute to www.unpbook.com (206.168.112.219): 30 hops max. 24 data bytes1 12.106.32.1 (12.106.32.1) 0.799 ms 0.719 ms 0.540 ms2 12.124.47.113 (12.124.47.113) 1.758 ms 1.760 ms 1.839 ms3 gbr2-p27.sffca.ip.att.net (12.123.195.38) 2.744 ms 2.575 ms 2.648 ms4 tbr2-p012701.sffca.ip.att.net (12.122.11.85) 3.770 ms 3.689 ms 3.848 ms5 gbr3-p50.dvmco.ip.att.net (12.122.2.66) 26.202 ms 26.242 ms
Пример
Пример Сначала мы запустим нашу программу с аргументом командной строки -0 и убедимся, что сервер имен отвечает на приходящие дейтаграммы, не содержащие контрольной суммы. Мы также задаем флаг -v.macosx # udpcksum -i en1 -0 -v bridget.rudoff.com domaindevice = en1local net = 172.24.37.64. netmask = 255.255.255.224cmd = udp and src host
9.4. Пример
9.4. Пример В архитектуре x86 есть инструкции, определяющие позицию старшего и младшего значащих битов в слове. Процессор выполняет эти инструкции очень быстро. С другой стороны, чтобы сделать то же самое на языке С, потребуется написать цикл с операциями побитового
Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя
Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя #!/bin/bash# timeout.sh# Автор: Stephane Chazelas,# дополнен автором документа.INTERVAL=5 # предел времени ожиданияtimedout_read() { timeout=$1 varname=$2 old_tty_settings=`stty -g` stty -icanon min 0 time ${timeout}0 eval read $varname # или просто read $varname
Пример 10-27. Простой пример сравнения строк
Пример 10-27. Простой пример сравнения строк #!/bin/bash# match-string.sh: простое сравнение строкmatch_string (){ MATCH=0 NOMATCH=90 PARAMS=2 # Функция требует два входных аргумента. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac}a=oneb=twoc=threed=twomatch_string $a # неверное число
Пример 12-20. Пример форматирования списка файлов в каталоге
Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее
Пример 12-45. Пример работы с m4
Пример 12-45. Пример работы с m4 #!/bin/bash# m4.sh: Демонстрация некоторых возможносией макропроцессора m4# Строкиstring=abcdA01echo "len($string)" | m4 # 7echo "substr($string,4)" | m4 # A01echo "regexp($string,[0-1][0-1],&Z)" | m4 # 01Z# Арифметикаecho "incr(22)" | m4 # 23echo "eval(99 / 3)" | m4 #
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков" #!/bin/bashARGS=1 # Ожидаемое число аргументов.E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS# Если
Пример 25-8. Пример реализации алгоритма Решето Эратосфена
Пример 25-8. Пример реализации алгоритма Решето Эратосфена #!/bin/bash# sieve.sh# Решето Эратосфена# Очень старый алгоритм поиска простых чисел.# Этот сценарий выполняется во много раз медленнее# чем аналогичная программа на C.LOWER_LIMIT=1 # Начиная с 1.UPPER_LIMIT=1000 # До 1000.# (Вы можете
Пример
Пример В примере создаются два класса обработчик и инициатор события, устанавливается связь между ними и иллюстрируется обработка события в нескольких объектах одновременно:#include "stdafx.h" #include "sigslot.h"struct EventRaiser { // источник события signal<const char*> event; // const char* – тип аргумента.