对子系统与 SRC 之间的通信进行编程
系统资源控制器 (SRC) 命令是可执行程序,它执行命令行的选项。
命令语法经过验证后,会调用 SRC 运行时子程序来构建 User Datagram Protocol (UDP) 数据报,并将其发送给 srcmstr 守护进程。
以下章节提供有关 SRC 子例程以及子系统如何使用它们与 SRC 主进程进行通信的更多信息。
对子系统进行编程以接收 SRC 请求
与接收 SRC 请求关联的编程任务因为为子系统指定的通信类型不同而不同。 srcmstr 守护程序使用套接字接收命令进程的工作请求,并构造必需的套接字或消息队列以转发工作请求。 每个子系统需要验证其套接字或消息队列的创建。 请阅读以下章节获取在子系统上编程以接收 SRC 请求数据包的特定通信类型指南的相关信息。
注:所有子系统,不管通信类型是哪一种,都必须定义信号捕获程序来处理 SIGTERM 请求。
接收 SRC 信号
使用信号作为其通信类型的子系统必须定义信号捕捉器例程以捕捉 SIGNORM 和 SIGFORCE 信号。 使用的信号捕捉方法是依赖于子系统的。 以下是可以用于该目的的子例程类型的两组示例。
| 子例程 | 描述 |
|---|---|
| sigaction, sigvec或 signal 子例程 | 指定传递信号时采取的操作。 |
| sigset, sighold, sigrelse或 sigignore 子例程 | 增强信号工具并提供应用程序进程的信号管理。 |
使用套接字来接收 SRC 请求数据包
当进行套接字子系统编程以接收 SRC 请求数据包时,请使用以下指南:
- 通过指定 /usr/include/spc.h 文件,将 SRC 子系统结构包含在子系统代码中。 该文件包含子系统用来响应 SRC 命令的结构。 另外,spc.h 文件包括 srcerrno.h 文件,它不需要被独立包括。 srcerrno.h 文件包含用于守护程序支持的错误代码定义。
- 当套接字子系统启动时,子系统接收 SRC 请求包的套接字被设置为文件描述符 0。 子系统应该通过调用 getsockname 子例程来验证这一点,该子例程返回子系统套接字的地址。 如果文件描述符 0 不是套接字,那么子系统应该记录为错误,然后退出。 请参阅 Communications Programming Concepts 中的 "Reading Internet Datagram Example Program" ,以获取有关如何使用 getsockname 子例程返回子系统套接字地址的信息。
- 如果子系统轮询多个套接字,请使用 select 子例程来确定要读取的套接字。 有关如何将 select 子例程用于此目的的更多信息,请参阅 Communications Programming Concepts 中的 "检查暂挂的连接示例程序" 。
- 使用 recvfrom 子例程从套接字获取请求包。
注意:子系统响应数据包的返回地址在接收到的 SRC 请求数据包中。 此地址不应与 recvfrom 子例程返回作为其参数之一的地址混淆。
在 recvfrom 子例程完成并且接收到包之后,使用 srcrrqs 子例程返回指向静态 srchdr 结构的指针。 该指针包含子系统回答的返回地址。 每次调用 srcrrqs 子例程都会覆盖此结构,所以如果在下一次调用 srcrrqs 子例程之后需要其内容,应该将其存储。
使用消息队列来接收 SRC 请求数据包
当进行消息队列子系统编程以接收 SRC 请求数据包时,请使用以下指南:
- 通过指定 /usr/include/spc.h 文件将 SRC 子系统结构包括在子系统代码中。 该文件包含子系统用来响应 SRC 命令的结构。 另外,spc.h 文件包括 srcerrno.h 包含文件,它不需要被独立包括。 srcerrno.h 文件包含用于守护程序支持的错误代码定义。
- 指定 -DSRCBYQUEUE 作为编译选项。 这将放置消息类型 (mtype) 字段作为 srcreq 结构中的第一个字段。 该结构应该在接收到 SRC 数据包的任何时候使用。
- 当子系统已启动时,使用 msgget 子例程验证是否在系统启动时创建了消息队列。 如果没有创建消息队列,子系统应该记录错误并退出。
- 如果子系统轮询多个消息队列,请使用 select 子例程来确定要读取的消息队列。 有关如何将 select 子例程用于此目的的信息,请参阅 Communications Programming Concepts 中的 "检查暂挂连接示例程序" 。
- 使用 msgrcv 或 msgxrcv 子例程从消息队列获取包。 子系统响应数据包的返回地址在接收到的数据包中。
- 当 msgrcv 或 msgxrcv 子例程完成并且已接收包时, 调用 srcrrqs 子例程以完成接收过程。 Srcrrqs 子例程返回指向静态 srchdr 结构(每次调用 srcrrqs 子例程时都被覆盖)的指针。 该指针包含子系统回答的返回地址。
对子系统进行编程以处理 SRC 请求数据包
子系统必须能够处理停止请求。 可以选择子系统来支持启动、状态、跟踪和刷新请求。
处理请求数据包涉及两个步骤的过程:
读取 SRC 请求数据包
子系统以 srcreq 结构(如同 /usr/include/spc.h 文件中所定义)的形式接收 SRC 请求数据包。 子系统请求位于 srcreq 结构的 subreq 结构中:
struct subreq
short object; /*object to act on*/
short action; /*action START, STOP, STATUS, TRACE,\
REFRESH*/
short parm1; /*reserved for variables*/
short parm2; /*reserved for variables*/
char objname; /*object name*/该objectsubreq 结构的字段指示应用请求的对象。 当请求应用于子系统时,object字段设置为 SUBSYSTEM 常量。 否则,object字段设置为子服务器代码点或objname字段以字符串形式设置为子服务器 PID。 确定请求应用于哪个对象是子系统的责任。
该action字段指定子系统请求的操作。 子系统应该理解 START、STOP 和 STATUS 操作码。 TRACE 和 REFRESH 操作码可选。
该parm1和parm2字段由每个操作以不同方式使用。
| 操作 | parm1 | parm2 |
|---|---|---|
| STOP | NORMAL 或 FORCE | |
| 状态 | LONGSTAT 或 SHORTSTAT | |
| 跟踪 | LONGTRACE 或 SHORT-TRACE | TRACEON 或 TRACEOFF |
START 子服务器和 REFRESH 操作不使用parm1和parm2字段。
对子系统进行编程来响应 SRC 请求
当对 SRC 定义了子系统对象时,为大部分 SRC 请求编写了合适的子系统操作。 子系统用于响应 SRC 请求的结构在 /usr/include/spc.h 文件中定义。 子系统可能使用下列 SRC 运行时子例程以满足命令处理需求:
状态请求处理需要任务和子例程的组合。
子系统接收到它们不能处理或无效的请求时,它们必须发送错误代码为 SRC_SUBICMD 的错误数据包以响应未知的或无效的请求。 SRC 将操作码 0-255 保留作 SRC 内部使用。 如果您的子系统接收到包含无效操作码的请求,那么子系统必须返回 SRC_SUBICMD 错误代码。 SRC 支持的有效操作码在 spc.h 文件中定义。 也可以定义子系统特定的操作码。 如果没有由 SRC 或您的子系统定义,操作码无效。
注意:操作码 0-255 被保留给 SRC 使用。
处理 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 子例程来检索要在状态数据开始时传回的标准状态头。
处理状态请求时,建议使用下列步骤:
- 要从子系统返回状态 (短或长) ,请分配 statcode 结构数组以及 srchdr 结构。 Srchdr
结构必须启动您响应状态请求而正在发送的缓冲区。 Statcode 结构在 /usr/include/spc.h 文件中定义。
struct statcode { short objtype; short status; char objtext [65]; char objname [30]; }; - 填写objtype带有 SUBSYSTEM 常量的字段,用于指示状态是针对子系统的,或者带有子服务器代码点,用于指示状态是针对子服务器的。
- 填写status具有 spc.h 文件中定义的某个 SRC 状态常量的字段。
- 填写objtext包含您希望显示为状态的 NLS 文本的字段。 此字段必须为以 NULL 终止的字符串。
- 填写objname具有子系统或子服务器名称的字段,objtext字段应用。 此字段必须为以 NULL 终止的字符串。
注意:子系统和请求者可以协商将其他子系统定义的信息发送回请求者。
对子系统进行编程以发送应答数据包
子系统返回至 SRC 的数据包应该为 /usr/include/spc.h 文件中所定义的 srcrep 的形式。 srcrep 结构一部分的 svrreply 结构将包含子系统应答:
struct svrreply
{
short rtncode; /*return code from the subsystem*/
short objtype; /*SUBSYSTEM or SUBSERVER*/
char objtext[65]; /*object description*/
char objname[20]; /*object name*/
char rtnmsg[256]; /*returned message*/
};使用 srcsrpy 子例程将包返回给请求者。
创建回复
要编写子系统应答,使用下列步骤:
- 填写 rtncode具有应用的 SRC 错误代码的字段。 使用 SRC_SUBMSG 作为rtncode字段以返回特定于子系统的 NLS 消息。
- 填写objtype带有 SUBSYSTEM 常量的字段,用于指示应答是针对子系统的,或者带有子服务器代码点,用于指示应答是针对子服务器的。
- 填写objname包含应用于应答的子系统名称,子服务器类型或子服务器对象的字段。
- 填写rtnmsg包含特定于子系统的 NLS 消息的字段。
- 在 srcsrpy Continued 参数中键入合适的条目。 请参阅“srcsrpy 连续数据包”以了解更多信息。
注: 子系统中的最后一个包必须始终在 srcsrpy 子例程的 Continued 参数中指定 END。
srcsrpy 连续数据包
子系统以连续数据包的形式响应 SRC 请求。 可以指定两种类型的连续数据包:参考消息和应答数据包。
参考消息不被传递回客户机。 相反,它被显示到客户机的标准输出。 消息必须包含 NLS 文本,消息标记由发送子系统填充。 要发送这种类型的连续数据包,在 srcsrpy 子例程的 Continued 参数中指定 CONTINUED。
注意:STOP 子系统操作不允许任何种类的连续。 然而,由子系统从 SRC 接收到的所有其他操作请求可能被发送一条参考消息。
应答数据包被传递回客户机以进一步处理。 因此,数据包必须由子系统和请求者协商一致。 这种类型连续的一个实例为状态请求。 响应子系统状态请求时,在 srcsrpy Continued 参数中指定 STATCONTINUED。 状态报告完成时,或者已经发送所有子系统定义的应答数据包时,在 srcsrpy Continued 参数中指定 END。 然后,数据包传递给客户机,以指示应答结束。
对子系统进行编程以返回 SRC 错误数据包
需要子系统同时为 SRC 错误和非 SRC 错误返回错误数据包。
返回 SRC 错误时,子系统返回的应答包应采用 srcrep 结构的 svrreply 结构的形式,具有objname字段中填充了出错的子系统名称,子服务器类型或子服务器对象。 如果与 SRC 错误关联的 NLS 消息不包含任何标记,错误数据包以短形式返回。 这意味着错误数据包只包含 SRC 错误号。 然而,如果标记与错误相关联,那么应该返回来自消息目录的标准 NLS 消息文本。
当返回非 SRC 错误时,应答包应该是具有以下结构的 svrreply 结构:rtncode字段设置为 SRC_SUBMSG 常量和rtnmsg字段设置为特定于子系统的 NLS 消息。 该rtnmsg将字段打印到客户机的标准输出。
响应跟踪请求
对 traceson 和 tracesoff 命令的支持依赖于子系统。 如果您选择支持这些命令,可以为子系统和子服务器指定跟踪操作。
子系统跟踪请求将以下列格式到达: 子系统跟踪请求将具有 subreq action字段设置为 TRACE 常量和 subreq object字段设置为 SUBSYSTEM 常量。 跟踪操作使用parm1以指示 LONGTRACE 或 SHORTTRACE 跟踪,以及parm2以指示 TRACEON 或 TRACEOFF。
当子系统接收跟踪子系统包时parm1设置为 SHORTTRACE 和parm2设置为 TRACEON ,子系统应开启短跟踪。 相反,当子系统接收跟踪子系统包时,parm1设置为 LONGTRACE 和parm2设置为 TRACEON ,子系统应开启长跟踪。 当子系统接收跟踪子系统包时parm2设置为 TRACEOFF 时,子系统应关闭子系统跟踪。
子服务器跟踪请求将以以下格式到达: 子服务器跟踪请求将具有 subreq action字段设置为 TRACE 常量和 subreq object字段设置为要发送状态的子服务器的子服务器代码点。 跟踪操作使用parm1指示 LONGTRACE 或 SHORTTRACE ,以及parm2以指示 TRACEON 或 TRACEOFF。
当子系统接收跟踪子服务器包时parm1设置为 SHORTTRACE 和parm2设置为 TRACEON ,子系统应打开子服务器短跟踪。 相反,当子系统接收跟踪子服务器包时,parm1设置为 LONGTRACE 和parm2设置为 TRACEON ,子系统应该打开子服务器长跟踪。 当子系统接收跟踪子服务器包时parm2设置为 TRACEOFF 时,子系统应关闭子服务器跟踪。
响应刷新请求
支持子系统刷新请求依赖于子系统。 选择支持 refresh 命令的子系统程序员应通过以下方式对其子系统进行编程以与 SRC 交互:
- 子系统刷新请求将具有 subreq 结构action字段设置为 REFRESH 常量和 subreq 结构object字段设置为 SUBSYSTEM 常量。 刷新子系统操作不使用parm1或parm2.
- 子系统接收到刷新请求时,子系统应该重新配置其本身。