Команды Контроллера системных ресурсов (SRC) - это исполняемые команды, которые получают аргументы из командной строки. После проверки синтаксиса команды вызываются динамические функции SRC для создания дейтаграммы Протокола пользовательских дейтаграмм (UDP) и ее отправки демону srcmstr.
Дополнительная информация о функциях SRC и их использовании подсистемами для связи с главным процессом SRC приведена в следующих разделах:
Способ получения подсистемой запросов от SRC зависит от выбранного способа обмена данными. Демон srcmstr получает запросы на обработку от процесса команды через сокеты и создает необходимый сокет или очередь сообщений для передачи этого запроса. Подсистема должна проверить, что сокет или очередь сообщений действительно были созданы. Различные варианты обмена данными с SRC описаны в разделе Способы обмена данными с SRC. Рекомендации по программированию пакетов с запросами SRC для подсистем, применяющих различные способы обмена данными, приведены в следующих разделах:
Примечание: Во всех подсистемах, независимо от применяемого способа обмена данными, должна быть определена процедура обработки сигнала SIGTERM.
В подсистемах, обменивающихся с
SRC сигналами, должна быть определена процедура обработки сигналов
SIGNORM и SIGFORCE. В ней может использоваться
любой метод обработки сигналов. Ниже приведено два примера подобных
функций.
Функции sigaction, sigvec и signal | Задают действие, которое должно быть выполнено при получении сигнала. |
Функции sigset, sighold, sigrelse и sigignore | Предоставляют для прикладных процессов расширенные функции для работы с сигналами и управления ими. |
Дополнительная информация приведена в разделе Обмен сигналами, "Основные сведения о типах передачи данных SRC".
Ниже приведены рекомендации по созданию подсистем, получающих пакеты с запросами SRC через сокеты:
Примечание: Целевой адрес для возврата ответа подсистемы хранится в полученном пакете с запросом SRC. Его не следует путать с адресом, который функция recvfrom возвращает в качестве одного из своих параметров.
После получения пакета с помощью функции recvfrom можно вызвать функцию srcrrqs, которая возвращает указатель на статическую структуру srchdr. Этот указатель позволяет получить адрес, по которому нужно отправить ответ подсистемы. Эта структура переопределяется при каждом вызове функции srcrrqs, поэтому ее нужно сохранить в некоторой переменной, если она еще потребуется после следующего вызова srcrrqs.
Дальнейшие действия, которые необходимо выполнить для настройки обмена данными с SRC, приведены в разделе Обработка подсистемами пакетов с запросами SRC.
Ниже приведены рекомендации по созданию подсистем, получающих пакеты с запросами SRC из очередей сообщений:
В подсистемах должна быть определена реакция на получение запроса на остановку. Помимо этого, подсистемы могут поддерживать запросы на запуск, получение информации о состоянии, трассировку и обновление.
Обработка пакета с запросом разбивается на два этапа:
Подсистема получает пакет с запросом SRC в виде структуры srcreq, описанной в файле /usr/include/spc.h. Запрос подсистемы расположен в структуре subreq, вложенной в структуру srcreq:
struct subreq short object; /*целевой объект */ short action; /*действие: START, STOP, STATUS, TRACE,\ REFRESH*/ short parm1; /*зарезервировано для переменных*/ short parm2; /*зарезервировано для переменных*/ char objname; /*имя объекта*/
Поле object структуры subreq задает объект, над которым нужно выполнить действие. Если запрос относится к подсистеме, в поле object указывается константа SUBSYSTEM. В противном случае в поле object указывается кодовый знак, либо в поле objname указывается PID субсервера в виде символьной строки. Ответственность за правильный выбор объекта, к которому относится запрос, ложится на подсистему.
Поле action задает запрошенное действие над подсистемой. Все подсистемы должны поддерживать действия START, STOP и STATUS. При необходимости, могут поддерживаться действия TRACE и REFRESH.
Поля parm1 и
parm2 применяются для различных целей, в зависимости от
запрошенного действия.
Действие | parm1 | parm2 |
STOP | NORMAL или FORCE |
|
STATUS | LONGSTAT или SHORTSTAT |
|
TRACE | LONGTRACE или SHORT-TRACE | TRACEON или TRACEOFF |
Для действий START и REFRESH поля parm1 и parm2 не используются.
Действия, которые выполняет
система в ответ на большинство запросов SRC, задаются при определении объекта
подсистемы в SRC. Дополнительная информация по этому вопросу приведена
в разделах Объекты SRC и Определение подсистемы в SRC. Структуры, применяемые подсистемами
при ответе на запросы SRC, определены в файле /usr/include/spc.h. Для обработки
команд в подсистемах могут применяться следующие динамические функции
SRC:
srcrrqs | Позволяет подсистеме сохранить заголовок запроса. |
srcsrpy | Позволяет подсистеме отправить ответ на запрос. |
Информация о применении этих команд при создании подсистемы приведена в разделе Ответ на запросы о трассировке и Ответ на запросы об обновлении.
Для обработки запросов на получение информации о состоянии требуется выполнить несколько задач и функций. Дополнительная информация по этому вопросу приведена в разделе Обработка запросов SRC на получение информации о состоянии.
В ответ на неизвестный или неверный запрос подсистема должна отправить пакет с этим запросом и кодом ошибки SRC_SUBICMD. Коды действий 0-255 зарезервированы в SRC для внутреннего использования. При получении подсистемой запроса с неправильным кодом действия она должна вернуть код ошибки SRC_SUBICMD. Правильные коды действий, поддерживаемые SRC, перечислены в файле spc.h. Кроме того, вы можете определить собственные коды действий. Код действия считается неправильным, если он не определен в SRC и подсистеме. Дополнительная информация приведена в разделе Возврат подсистемами пакетов с ошибками SRC.
Примечание: Коды действий 0-255 зарезервированы для SRC.
Подсистема может получить запрос на отправку отчета о состоянии одного из трех типов: подробного отчета о состоянии подсистемы, краткого отчета о состоянии субсервера и подробного отчета о состоянии субсервера.
Примечание: Краткие отчеты о состоянии подсистемы составляются демоном srcmstr. Код состояния и константы, описывающие состояние, которые указываются в отчетах этого типа, определены в файле /usr/include/spc.h. В таблице Константы состояния перечислены обязательные и дополнительные коды состояния, которые могут быть возвращены в ответ на запрос.
Коды состояния, которые могут встретиться в ответе | |||
Значение | Описание | Подсистема | Субсервер |
SRCWARN | Получен запрос на остановку. (Будет остановлена в течение 20 секунд.) | X | X |
SRCACT | Запущена и работает. | X | X |
SRCINAC | Не работает. |
|
|
SRCINOP | Неисправна. | X | X |
SRCLOSD | Закрыта. |
|
|
SRCLSPN | Закрывается. |
|
|
SRCNOSTAT | Простаивает. |
|
|
SRCOBIN | Открыта, но не работает. |
|
|
SRCOPND | Открыта. |
|
|
SRCOPPN | Открывается. |
|
|
SRCSTAR | Запускается. |
| X |
SRCSTPG | Останавливается. | X | X |
SRCTST | Выполняется проверка. |
|
|
SRCTSTPN | Ожидание проверки. |
|
|
Команда SRC lssrc записывает полученную информацию в стандартный вывод. Информация, которая возвращается в ответ на запрос о подробном отчете о состоянии, определяется программистом подсистемы. При необходимости подсистема может отслеживать состояние своих субсерверов и сообщать о его изменении. С помощью функции srcstathdr можно получить стандартный заголовок отчета о состоянии и добавить его к своим данным о состоянии.
Обработку запроса на получение информации о состоянии рекомендуется разбить на следующие шаги:
struct statcode { short objtype; short status; char objtext [65]; char objname [30]; };
Примечание: Подсистема и инициатор запроса могут договориться об отправке другой информации в ответ на запрос. Дополнительная информация о таком типе ответов приведена в разделе Пакеты с продолжением srcsrpy.
В ответ на запросы SRC подсистема должна отправлять структуру srcrep, описанную в файле /usr/include/spc.h. Ответ должен содержаться в структуре svrreply, вложенной в структуру srcrep:
struct svrreply { short rtncode; /*код возврата подсистемы */ short objtype; /*SUBSYSTEM или SUBSERVER*/ char objtext[65]; /*описание объекта*/ char objname[20]; /*имя объекта*/ char rtnmsg[256]; /*ответ */ };
Для отправки пакета с ответом предназначена функция srcsrpy.
Для создания ответа подсистемы выполните следующую процедуру:
Примечание: При отправке последнего пакета в параметре Continued функции srcsrpy должно быть указано значение END.
Ответ подсистемы на запрос SRC представляет собой набор пакетов с продолжением. Существует два типа пакетов с продолжением: информационное сообщение и пакет с ответом.
Информационное сообщение не возвращается клиенту. Оно записывается в стандартный вывод клиента. Сообщение должно представлять собой текст NLS с маркерами сообщения, составленный подсистемой-отправителем. Для отправки такого пакета с продолжением укажите в параметре Continued функции srcsrpy значение CONTINUED.
Примечание: В ответ на запрос действия STOP не разрешается отправлять пакеты с продолжением. В ответ на все остальные запросы SRC, полученные подсистемой, может быть отправлено информационное сообщение.
Пакет с ответом возвращается клиенту для дальнейшей обработки. Формат этого пакета должен быть согласован между инициатором и подсистемой. Примером запроса, в ответ на который может быть отправлено такое продолжение, может служить запрос на получение информации о состоянии. При получении подсистемой этого запроса укажите в параметре Continued функции srcsrpy значение STATCONTINUED. После отправки всего отчета о состоянии или всех пакетов с ответом подсистемы укажите в параметре Continued функции srcsrpy значение END. Клиенту будет передан пакет, означающий завершение ответа.
Подсистемы должны отправлять пакеты с информацией обо всех ошибках SRC и других ошибках.
Информация об ошибке SRC должна возвращаться подсистемой в виде структуры svrreply, вложенной в структуру srcrep. В поле objname этой структуры должно быть указано имя подсистемы, тип субсервера или объект субсервера, в котором возникла ошибка. Если сообщение NLS, связанное с данной ошибкой SRC, не содержит маркеров, возвращается пакет с краткой информацией об ошибке. Это означает, что пакет содержит только номер ошибки SRC. Если с данной ошибкой связаны маркеры, то должно быть возвращено сообщение NLS из каталога сообщений.
При возникновении ошибки, не связанной с SRC, должен быть отправлен пакет со структурой svrreply, в которой полю rtncode присвоено значение SRC_SUBMSG, а в поле rtnmsg указано сообщение NLS подсистемы. Поле rtnmsg записывается в стандартный вывод клиента.
Подсистема не обязана поддерживать команды traceson и tracesoff. Однако поддержка этих команд позволяет выполнять трассировку подсистемы и субсервера.
Запросы на трассировку подсистемы отправляются в виде структуры subreq, полю action которой присвоено значение TRACE, а полю object - значение SUBSYSTEM. В параметре parm1 указывается тип трассировки (LONGTRACE или SHORTTRACE), а в параметре parm2 указывается, нужно ли включить или выключить трассировку (значение TRACEON или TRACEOFF).
Если подсистема получает пакет с запросом на трассировку, в котором parm1 равен SHORTTRACE, а parm2 равен TRACEON, то подсистема должна включить функцию трассировки. Если подсистема получит пакет с запросом на трассировку, в котором parm1 равен LONGTRACE, а параметр parm2 равен TRACEON, то подсистема должна включить функцию подробной трассировки. При получении пакета с запросом, в котором parm2 будет равен TRACEOFF, подсистема должна выключить трассировку.
В запросе на трассировку субсервера поле action структуры subreq равно TRACE, а поле object содержит кодовый знак субсервера, для которого должна быть включена трассировка. В параметре parm1 указывается тип трассировки (LONGTRACE или SHORTTRACE), а в параметре parm2 указывается, нужно ли включить или выключить трассировку (значение TRACEON или TRACEOFF).
Если подсистема получает пакет с запросом на трассировку субсервера, в котором parm1 равен SHORTTRACE, а parm2 равен TRACEON, то подсистема должна включить трассировку субсервера. Если подсистема получает пакет с запросом на трассировку субсервера, в котором parm1 равен LONGTRACE, а parm2 равен TRACEON, то она должна включить подробную трассировку субсервера. При получения пакета с запросом на трассировку субсервера, в котором parm2равен TRACEOFF, подсистема должна выключить трассировку субсервера.
Не все подсистемы поддерживают запросы на обновление. Подсистемы, поддерживающие команду refresh, должны отвечать на нее SRC следующим образом:
Глава 26, Контроллер системных ресурсов
Основные сведения о семействе протоколов Network Systems (NS)
Список дополнительных функций SRC
Команды srcmstr, traceson, tracesoff, refresh
Функции srcsbuf, srcsrpy, srcstathdr, srcstat
Файл spc.h