科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网服务器频道IBM AIX系统资源控制器(SRC)介绍及应用

IBM AIX系统资源控制器(SRC)介绍及应用

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SRC 即子系统控制器。拥有一个或多个守护进程的子系统程序员可使用 SRC 服务为它们的应用程序定义一个一致的系统管理接口。SRC 提供一组单独的命令以启动、停止、跟踪、刷新以及查询子系统的状态。

来源:pseries.cn 2008年1月15日

关键字: AIX 服务器 小型机 POWER服务器

  • 评论
  • 分享微博
  • 分享邮件


SRC 即子系统控制器。拥有一个或多个守护进程的子系统程序员可使用 SRC 服务为它们的应用程序定义一个一致的系统管理接口。SRC 提供一组单独的命令以启动、停止、跟踪、刷新以及查询子系统的状态。

此外,SRC 提供的通知设施错误。可使用此设施合并系统特定的恢复方法。包括的恢复信息的类型仅受某一需求的限制,该需求即通知方法在文件中为字符串,并且可被执行。

SRC 对象 
SRC 通信类型 
对使用 SRC 的子系统进行编程 
给 SRC 定义子系统 
其它 SRC 子例程列表
与 SRC 交互的子系统
SRC 将子系统定义为旨在作为一个单元执行相关函数的一个程序或一组相关程序。请参阅《AIX 5L V5.3 系统管理指南:操作系统与设备》 中的“系统资源控制器概述”,以获得有关子系统特征的更为详细的描述。

子服务器即属于子系统的进程,它受管于子系统。

SRC 在 SRC 对象类中的对象上运作。将子系统定义为 SRC 的子系统对象;将子服务器定义为子服务器类型对象。在 usr/include/sys/srcobj.h 文件中,对与每种类型的对象相关联的结构进行预定义。

SRC 可对子系统、子服务器和子系统组级别的对象发出 SRC 命令。子系统是一组任意用户指定的子系统。对子系统进行分组允许仅调用一个单独命令便可控制多个子系统。子系统的各个组还可以共享公共通知方法。

SRC 通过发送信号并交换请求和答复包与子系统通信。除了信号之外,SRC 还辨认套接字和 IPC 消息队列通信类型。可把许多子例程用作 SRC API 以辅助子系统和 SRC 之间的编程通信。SRC API 还支持客户机程序和 SRC 之间的编程通信。有关可用子例程的更多信息,请参阅其它 SRC 子例程列表。

SRC 和 init 命令
SRC 在运营上独立于 init 命令。然而,SRC 致力于扩展此命令提供的进程衍生功能。除了提供单一控制点以启动、停止、跟踪、刷新和查询子系统状态外,SRC 还可控制个别子系统的操作、支持远程系统控制并记录子系统故障。

在运营上,init 命令和 SRC 交互仅发生在 srcmstr(SRC 主)守护进程被嵌入到 inittab 文件中时。在缺省情况下,srcmstr 守护进程位于 inittab 文件中。在此情况下,init 命令在系统启动时启动 srcmstr 守护进程,和其它进程一样。必须具有 root 用户权限或在系统组中才可调用 srcmstr 守护进程。

编辑将要与 srcmstr 守护进程交互的程序
要使程序与 srcmstr 守护进程交互,必须包括 /usr/include/spc.h 文件,而且应该使用 libsrc.a 库编译程序。如果子系统使用信号与 SRC 通信,则不需要此支持。

SRC 操作
要使用 SRC 功能,必须使用两种方法将子系统与 srcmstr 守护进程交互:

必须为 SRC 子系统对象类中的子系统创建子系统对象。 
如果子系统使用信号,则它不必使用 SRC 子例程。然而,如果它使用消息队列或套接字,它必须使用 SRC 子例程响应停止请求。
所有的 SRC 子系统必须支持 stopsrc 命令。SRC 使用此命令停止带有 SIGNORM(正常停止)、SIGFORCE(强行停止)或 SIGCANCEL(取消系统)信号的子系统及其子服务器。

对于 startsrc、lssrc -l、traceson、tracesoff 和 refresh 命令,长状态和子服务器状态报表以及 SRC 通知机制,子系统支持是可选的。请参阅对使用 SRC 的子系统进行编程,以获得详细信息。

SRC 能力
SRC 为子系统程序员提供以下支持:

支持向子系统开始、停止发送请求的常用命令接口 
子系统和子系统组的中心控制点 
向子系统发送请求的常用该格式 
子服务器的定义,由于定义给子系统的子服务器是唯一的,这样可以管理每个子服务器 
定义子系统特定错误通知方法的能力 
将系统特定响应定义给状态、跟踪支持和配置刷新请求的能力 
在网络计算环境中服务于子系统请求的单点控制

SRC 对象
系统资源控制器(SRC)定义并管理三个对象类:

子系统对象类 
子服务器类型对象类 
通知对象类
同时,这些对象类还代表 SRC 在其中执行其函数的域。一组预定义的对象类描述符由 SRC 支持的子系统配置的可能集合组成。


注意:仅需要 SRC 子系统对象类。子服务器类型和通知对象类的使用是系统相关的。
子系统对象类
子系统对象类包含所有 SRC 子系统的描述符。在子系统可被 SRC 辨认之前,必须在这个类中配置该子系统。

子系统对象类的描述符是在 /usr/include/sys/srcobj.h 文件的 SRCsubsys 结构中定义的。子系统对象描述符和描述符表提供了系统描述符以及与每个描述符相关的 mkssys 和 chssys 命令标志的简短演示。

表 9. 子系统对象描述符和缺省值 描述符 缺省值 标志 
子系统名称 
-s 
子系统命令路径 
-p 
命令参数 
-a 
执行优先级 20 -E 
多个实例 NO -Q -q 
用户标识 
-u 
同义词名称(关键字) 
-t 
启动操作 ONCE -O -R 
stdin /dev/console -i 
stdout /dev/console -o 
stderr /dev/console -e 
通信类型 Socket -K -I -S 
子系统消息类型 
-m 
通信 IPC 队列密钥 
-l 
组名 
-G 
SIGNORM 信号 
-n 
SIGFORCE 信号 
-f 
显示 是 -D -d 
等待时间 20 秒 -w 
Auditid 

子系统对象描述符定义如下:

子系统名称 指定子系统对象的名称。这个名称不得超过 30 个字节,其中包括 null 终止符(对于单字节字符集为 29 个字符,而对于多字节字符集为 14 个字符)。此描述符必须符合 POSIX。此字段是必需的。 

子系统命令路径 指定由子系统启动命令执行的程序的全路径名。路径名不得超过 200 个字节,其中包括 null 终止符(对于单字节字符集为 199 个字符,而对于多字节字符集为 99 个字符)。路径名必须符合 POSIX。此字段是必需的。 

命令参数 指定必须传送到启动子系统的命令的任何参数。参数不得超过 200 个字节,其中包括 null 终止符(对于单字节字符集为 199 个字符,而对于多字节字符集为 99 个字符)。参数是由 srcmstr 守护进程根据 shell 使用的相同规则解析的。例如:引用字符串作为单独的参数传递,引用字符串外的空格是定界参数。 

执行优先级 指定要运行的子系统的进程优先级。由 srcmstr 守护进程启动的子系统运行此优先级。缺省值为 20。 

多个实例 指定一次可以运行的子系统实例数。值 NO(-Q 标志)指定一次仅可运行一个子系统实例。在该子系统已在运行时试图启动它的这一操作将失败,试图在同一 IPC 消息队列密钥上启动某一子系统也将失败。值 YES(-q 标志)指定多个子系统可使用同一 IPC 消息队列,并且同一子系统可有多个实例。缺省值为 NO。 

用户标识 指定在其下运行子系统的用户标识。值 0 指示 root 用户。此字段是必需的。 

同义词名称 指定将要用作子系统备用名的字符串。这个字符串不得超过 30 个字节,其中包括 null 终止符(对于单字节字符集为 29 个字符,而对于多字节字符集为 14 个字符)。此字段是可选的。
 
启动操作 指定 srcmstr 守护进程是否在子系统异常终止后重新启动它。值 RESPAWN(-R 标志)指定 srcmstr 守护进程应该重新启动子系统。值 ONCE( -O 标志)指定 srcmstr 守护进程不应该试图重新启动发生故障的系统。在指定的等待时间内,对两次重新启动有衍生限制。如果不能成功地重新启动发生故障的子系统,请参考通知方法选项。缺省值为 ONCE。 

标准输入文件/设备 指定子系统从其检索其输入的文件或设备。缺省值为 /dev/console。此字段不得超过 200 个字节,其中包括 null 终止符(对于单字节字符集为 199 个字符,而对于多字节字符集为 99 个字符)。如果通信类型为套接字,则忽略此字段。 

标准输出文件/设备 指定要向其发送其输出的文件或设备。此字段不得超过 200 个字节,其中包括 null 终止符(对于单字节字符集为 199 个字符,而对于多字节字符集为 99 个字符)。缺省值为 /dev/console。 

标准错误文件/设备 指定子系统将要向其写入其错误消息的文件或设备。此字段不得超过 200 个字节,其中包括 null 终止符(对于单字节字符集为 199 个字符,而对于多字节字符集为 99 个字符)。将故障作为通知方法的一部分处理。缺省值为 /dev/console。 

注意:将灾难性错误被发送到错误日志。 

通信类型 指定 srcmstr 守护进程和子系统之间的通信方法。可定义三种类型:IPC(-I)、套接字(-K)或信号(-S)。缺省值为套接字。
 
通信 IPC 队列密钥 指定与 srcmstr 守护进程用来与子系统通信的 IPC 消息队列密钥相对应的十进制值。对于使用 IPC 消息队列进行通信的子系统,此字段是必需的。使用具有全限定路径名和标识参数的 ftok 子例程,以确保此密钥唯一。srcmstr 守护进程在启动子系统之前创建消息队列。
 
组名 指定子系统为组的成员。此字段不得超过 30 个字节,其中包括 null 终止符(对于单字节字符集为 29 个字符,而对于多字节字符集为 14 个字符)。此字段是可选的。 

子系统消息类型 指定置于子系统消息队列上的消息的 mtype。子系统通过使用 msgrcv 或 msgxrcv 子例程使用该值检索消息。如果正在使用消息队列,则需要此字段。 

SIGNORM 信号值 指定发出正常停止请求时将要发送给子系统的值。对于使用信号通信类型的子系统,此字段是必需的。 

SIGFORCE 信号值 指定发出强制停止请求时将要发送给子系统的值。对于使用信号通信类型的子系统,此字段是必需的。 

显示值 指示是否可将不可操作的子系统的状态显示在 lssrc -a 或 lssrc -g 输出上。-d 标志指示显示;-D 标志指示不显示。缺省值为 -d(显示)。 

等待时间 指定在采取备用操作之前子系统完成重新启动或停止请求所需的时间(以秒为单位)。缺省值为 20 秒。 

Auditid 指定子系统审计标识。定义子系统时由 srcmstr 守护进程自动创建的,此字段为安全系统所用(如果配置)。此字段无法被程序设置或更改。 

请参阅给 SRC 定义子系统,以获得定义和修改子系统对象的相关信息。

子服务器类型对象类

如果子系统具有子服务器并且该子系统希望从 srcmstr 守护进程处接收到子服务器相关命令,则必须在此类中配置对象。

此对象类包含三个描述符,这些描述符被定义在 srcobj.h 文件的 SRCsubsvr 结构中:

子服务器标识(密钥) 指定子服务器类型对象标识的名称。子服务器类型名称集定义了子服务器命令 -t 标志的允许值。名称长度不得超过 30 个字节,其中包括 null 终止符(对于单字节字符集为 29 个字符,而对于多字节字符集为 14 个字符)。 

所有子系统名称 指定拥有子服务器对象的子系统的名称。将此字段作为链接定义给 SRC 子系统对象类。 

代码点 指定标识子服务器的十进制数字。将代码点传递到在 SRC 请求结构的 subreq 结构的 object 字段中控制子服务器的子系统。如果在命令中也提供了子服务器对象名,则 srcmstr 守护进程将代码点转发到 subreq 结构的 objname 字段中的子系统。请参阅 spc.h 文件文档中的“SRC 请求结构示例”,以获得这些因素的示例。 

参考子服务器的命令将每个子服务器标识为子服务器的命名类型,并且还可将某一名称追加到子服务器类型的每个实例。SRC 守护进程使用子服务器类型确定子服务器的控制子系统,但不检查子服务器名称。

请参阅给 SRC 定义子系统,以获得定义和修改子服务器类型对象的相关信息。

通知对象类

这个类为 srcmstr 守护进程提供了一个机制,使其在检测到子系统故障时调用子系统提供的例程。当 SRC 守护进程接收到指示子系统进程终止的 SIGCHLD 信号,它就检查子系统(由 srcmstr 守护进程维护的)的状态以确定这一终止是否由 stopsrc 命令引发。如果未发出 stopsrc 命令,则此终止将被解释为异常终止。如果定义中的重新启动操作不指定重新衍生,或重新衍生尝试失败,则 srcmstr 守护进程尝试着从通知对象类读取与子系统名称相关的对象。如果找到类似对象,则运行与子系统相关联的方法。

如果没有在通知对象类中找到子系统对象,则 srcmstr 守护进程就确定该子系统是否属于某一组。如果是,srcmstr 守护进程尝试着从通知对象类读取该组名的对象。如果找到类似对象,则调用与之相关的方法。这样,子系统的组便可共享常用方法。

注意:子系统通知方法优先于组通知方法。因此,子系统可属于一起启动的某一组,但仍然定义特定的恢复或清除例程。

通知对象由两个描述符定义:

子系统名称或组名 指定为其定义通知方法的子系统或组的名称。 
通知方法 指定当 srcmstr 守护进程检测到子系统或组的异常终止时执行的例程的全路径名。 

当特定恢复或清除工作需要在重新启动子系统之前被执行时,此类通知很有用处。它还可被用来收集信息以确定子系统异常停止的原因。

通知对象是通过使用 mknotify 命令创建的。要修改通知对象,必须使用 rmnotify 命令除去现有通知对象,然后创建新的通知对象。

mknotify 向 SRC 配置数据库添加通知方法 
rmnotify 从 SRC 配置数据库除去通知方法 

srcmstr 守护进程记录子系统恢复活动。该子系统复杂报告子系统故障。

SRC 通信类型

系统资源控制器(SRC)支持三种通信类型:信号、socket 和进程间通信(IPC)消息队列。选择的通信类型决定子系统利用 SRC 功能的等级。

注:

所有的子系统,不管其在系统环境对象中指定的通信类型如何,都必须能支持受限的信号通信。必须定义信号捕捉器,以处理 SIGTERM(取消停止)信号。SIGTERM 信号指示子系统应该清除所有的资源然后终止。

请参阅以下章节了解更多关于 SRC 通信类型的信息:

信号通信 
Socket 通信 
IPC 消息队列通信
srcmstr 守护程序和子系统之间的通信表概括了与 SRC 关联的通信类型操作。

srcmstr 守护程序与子例程之间的通信 
功能 使用 IPC 或 Socket 使用信号 
启动 


子系统 SRC 派生和执行以创建子系统进程。 SRC 派生和执行以创建子系统进程。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
正常停止 


子系统 使用 IPC 消息队列或套接字发送请求至子系统。 发送 SIGNORM 至子系统。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
强制停止 


子系统 使用 IPC 消息队列或套接字发送请求至子系统。 发送 SIGFORCE 至子系统。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
取消停止 


子系统 发送 SIGTERM,然后发送 SIGKILL 至子系统的进程组。 发送 SIGTERM,然后发送 SIGKILL 至子系统的进程组。 
短暂停止 


子系统 由 SRC 实现(无子系统请求)。 由 SRC 实现(无子系统请求)。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
长时间停止 


子系统 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
跟踪打开/跟踪关闭 


子系统 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
刷新 


子系统 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
子服务器 使用 IPC 消息队列或套接字发送请求至子系统。 不受支持。 
通知 


子系统 由子系统提供的方法实现。 由子系统提供的方法实现。 

信号通信
子系统和 srcmstr 守护进程之间最基本的通信类型由信号实现。因为信号构成单向通信方案,信号子系统识别的唯一 SRC 命令是停止请求。使用信号的子系统不识别长状态、刷新或跟踪请求。它们也不识别子服务器。

信号子系统必须实现信号捕捉器例程,例如 sigaction、sigvec 或 signal 子例程,以处理 SIGNORM 和 SIGFORCE 请求。

通过发出 mkssys -Snf 命令字符串或使用 defssys 和 addssys 子例程,在 SRC 子系统对象类中指定信号子系统。

addssys 向 SRC 配置数据库添加子系统定义 
defssys 使用缺省值初始化新的子系统定义 
mkssys 向 SRC 配置数据库添加子系统定义 

Socket 通信
越来越多的子系统程序员选择的通信选项为 socket。Socket 也是 srcmstr 守护进程的缺省通信类型。请参阅在 AIX 5L Version 5.3 Communications Programming Concepts 中的 Socket 概述以获取更多信息。

srcmstr 守护进程使用 socket 接收命令进程的工作请求。当选择了这种通信类型时,srcmstr 守护进程创建子系统套接字,子系统将在其中接收 srcmstr 守护进程请求。UNIX 套接字(AF_UNIX)为本地子系统创建。因特网套接字(AF_INET)为远程子系统创建。以下步骤描述命令处理顺序:

命令进程接受来自输入设备的命令,构造工作请求消息,然后将工作请求 UDP 数据报发送到明确的SRC 端口上的 srcmstr 守护进程。AF_INET 在 /etc/services 文件中定义。
 
srcmstr 守护进程侦听明确的 SRC 端口的工作请求。当接收到工作请求时。它会告诉系统填充socket 子例程的 sockaddr 结构,以获取原系统的地址,并将地址和端口号追加到工作请求。 

srcmstr 守护进程使用 srcrrqs 和 srcsrpy 子例程。它只处理它能处理的那些请求,然后将信息发送回命令进程。其它的请求被转发到已经为工作请求指定了子系统的端口上合适的子系统。 

子系统侦听之前由 srcmstr 守护进程获取的端口上的子系统。(当 srcmstr 守护进程启动子系统时,每个子系统继承一个端口。)子系统处理工作请求并将回复发送回命令进程。 

命令进程侦听指定端口上的响应。

srcmstr 守护进程使用的文件访问许可权和套接字的地址在 /dev/SRC 和 /dev/.SRC-unix 临时目录中维护。虽然使用 ls 命令可以显示这些目录中包含的信息,但这些信息只用于内部 SRC 用途。

消息队列和套接字提供同样的子系统功能。

请参阅对使用 SRC 的子系统进行编程获取更多信息。

srcrrqs 将您子系统响应的目标地址保存到接收的数据包。(另见多线程安全版本 srcrrqs_r) 
srcsrpy 将子系统响应数据包发送至子系统接收的请求。 

IPC 消息队列通信
IPC 消息队列功能类似于套接字功能。这两种通信类型都支持功能完全的 SRC 环境。

当通信类型为 IPC 消息队列时,srcmstr 守护进程使用套接字接收命令进程的工作请求,然后使用IPC 消息队列,子系统在其中接收 SRC 消息。当子系统启动时,创建消息队列,然后使用它。消息队列使用以下命令处理顺序与 srcmstr 守护进程进行通信:

srcmstr 守护进程从 SRC 子系统对象获取消息队列标识,然后将消息发送到子系统。
 
子系统等待消息队列,然后发出 msgrcv 子例程,以子系统请求要求的 subreq 结构接收来自消息队列的命令。 

子系统调用 srcrrqs 子例程,以获取响应消息时使用的标记标识。 

子系统继承并处理接收的命令。根据命令,子系统创建 svrreply 或 statcode 数据结构以将回复返回到命令进程。请参阅 /usr/include/spc.h 文件获取关于这些结构的更多信息。
 
子系统调用 srcsrpy 子例程以将回复缓存发送回命令进程。

对使用 SRC 的子系统进行编程

系统资源控制器(SRC)命令是可执行程序,它执行命令行的选项。在验证了命令语法之后,命令调用 SRC 运行时子例程以构造用户数据报协议 (UDP)数据报,并将其发送到 srcmstr 守护进程。

以下章节提供关于 SRC 子例程以及子系统如何使用它们与 SRC 主进程进行通信的更多信息。

对子系统编程以接收 SRC 请求. 
对子系统编程以处理 SRC 请求数据包. 
对子系统编程以发送答复数据包. 
对子系统编程以返回 SRC 错误数据包. 
响应跟踪请求. 
响应刷新请求.
对子系统编程以接收 SRC 请求
与接收 SRC 请求关联的编程任务因为为子系统指定的通信类型不同而不同。srcmstr 守护进程使用套接字接收命令进程的工作请求,并构造必需的套接字或消息队列以转发工作请求。每个子系统需要验证其套接字或消息队列的创建。请参阅SRC 通信类型获取 SRC 通信类型的描述。请阅读以下章节获取在子系统上编程以接收 SRC 请求数据包的特定通信类型指南的相关信息。

接收 SRC 信号. 
使用套接字接收 SRC 请求数据包. 
使用消息队列接收 SRC 请求数据包. 

注意:所有的子系统(不管其通信类型如何)必须定义信号捕捉器例程以处理 SIGTERM 请求。
接收 SRC 信号

使用信号作为其通信类型的子系统必须定义信号捕捉器例程以捕捉 SIGNORM 和 SIGFORCE 信号。使用的信号捕捉方法是依赖于子系统的。以下是可以用于该目的的子例程类型的两组示例。

sigaction、sigvec 或 signal 子例程 指定传递信号时采取的操作。 
sigset、sighold、sigrelse 或 sigignore 子例程 增强信号设施并提供应用程序进程的信号管理。 

请参阅信号通信获取更多信息。

使用套接字接收 SRC 请求数据包

当进行 socket 子系统编程以接收 SRC 请求数据包时,请使用以下指南:

通过指定 /usr/include/spc.h 文件将 SRC 子系统结构包括在您的子系统代码中。该文件包含子系统用来响应 SRC 命令的结构。另外,spc.h 文件包括 srcerrno.h 文件,它不需要被独立包括。

srcerrno.h 文件包含用于守护进程支持的错误代码定义。 

当启动套接字子系统时,子系统接收 SRC 请求数据包所在的套接字被设置为文件描述符 0。子系统应该通过调用 getsockname 子例程(返回子系统套接字的地址),验证该值。如果文件描述符 0 不是套接字,则子系统应该记录为错误,然后退出。请参阅在AIX 5L Version 5.3 Communications Programming Concepts 中的 “读取因特网数据报实例程序”,以了解关于 getsockname 子例程可如何用于返回子系统套接字的地址的信息。
 
如果子系统轮询多个套接字,则请使用 select 子例程确定哪些套接字需要读取。请参阅在AIX 5L Version 5.3 Communications Programming Concepts 中的 “检查暂挂连接实例程序”,以获取关于 select 子例程如何用于此目的的更多信息。
 
使用 recvfrom 子例程从套接字获取请求数据包。 

注意:子系统响应数据包的返回地址在接收到的 SRC 请求数据包中。此地址不应与 recvfrom 子例程返回作为其参数之一的地址混淆。

Recvfrom 子例程完成且接收到数据包之后,使用 srcrrqs 子例程返回指向静态 srchdr 结构的指针。该指针包含子系统回答的返回地址。每次调用 srcrrqs 子例程都会覆盖此结构,所以如果在下一次调用srcrrqs 子例程之后需要其内容,应该将其存储。

请参阅对子系统编程以处理 SRC 请求数据包以了解与 SRC 建立子系统通信的下一个步骤。

使用消息队列接收 SRC 请求数据包

当进行消息队列子系统编程以接收 SRC 请求数据包时,请使用以下指南:

通过指定 /usr/include/spc.h 文件将 SRC 子系统结构包括在您的子系统代码中。该文件包含子系统用来响应 SRC 命令的结构。另外,spc.h 文件包括 srcerrno.h 包含文件,它不需要被独立包括。Srcerrno.h 文件包含守护进程支持的错误代码定义。
 
指定 -DSRCBYQUEUE 作为一个编译选项。这将一个消息类型(mtype)字段作为 srcreq 结构中的第一个字段。该结构应该在接收到 SRC 数据包的任何时候使用。
 
已经启动子系统时,使用 msgget 子例程来验证在系统启动时创建了消息队列。如果没有创建消息队列,子系统应该记录错误并退出。 

如果子系统轮询多个消息队列,使用 select 子例程确定哪个消息队列有需要读取的内容。请参阅在 AIX 5L Version 5.3 Communications Programming Concepts 中的 “检查暂挂连接实例程序”,以获取关于 select 子例程如何用于此目的的信息。 

使用 msgrcv 或 msgxrcv 子例程从消息队列获取数据包。子系统响应数据包的返回地址在接收到的数据包中。 

当 msgrcv 或 msgxrcv 子例程完成且已经接收到数据包之后,调用 srcrrqs 子例程来完成接收过程。Srcrrqs 子例程返回指向静态 srchdr 结构(每次调用 srcrrqs 子例程时都被覆盖)的指针。该指针包含子系统回答的返回地址。

对子系统编程以处理 SRC 请求数据包

子系统必须能够处理停止请求。可以选择子系统来支持启动、状态、跟踪和刷新请求。

处理请求数据包涉及两个步骤的过程:

读 SRC 请求数据包 
编写子系统对 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*/
subreq 结构的 Object 字段指示请求应用于其上的对象。请求应用于子系统时,object 字段被设置为 SUBSYSTEM 常数。否则,object 字段被设置为子服务器代码点,或者 objname 字段被作为字符串设置为子服务器 PID。确定请求应用于哪个对象是子系统的责任。

Action 字段指定子系统请求的操作。子系统应该理解 START、STOP 和 STATUS 操作码。TRACE 和 REFRESH 操作码可选。

Parm1 和 parm2 字段由每个操作进行不同使用。

Action parm1 parm2 
STOP NORMAL 或 FORCE 

STATUS LONGSTAT 或 SHORTSTAT 

TRACE LONGTRACE 或 SHORT-TRACE TRACEON 或 TRACEOFF 

START 子服务器和 REFRESH 操作不使用 parm1 和 parm2 字段。

编写子系统对 SRC 请求的响应
当对 SRC 定义了子系统对象时,为大部分 SRC 请求编写了合适的子系统操作。请参阅SRC 对象和给 SRC 定义子系统以了解更多信息。子系统用于响应 SRC 请求的结构在 /usr/include/spc.h 文件中定义。子系统可能使用下列 SRC 运行时子例程以满足命令处理需求:

srcrrqs 允许子系统存储来自请求的报头。 
srcsrpy 允许子系统向请求发出答复。 

请参阅响应跟踪请求和响应刷新请求,以了解关于在子系统中为这些命令编写支持的信息。

状态请求处理需要任务和子例程的组合。请参阅处理 SRC 状态请求以了解更多信息。

子系统接收到它们不能处理或无效的请求时,它们必须发送错误代码为 SRC_SUBICMD 的错误数据包以响应未知的或无效的请求。SRC 将操作码 0-255 保留作 SRC 内部使用。如果您的子系统接收到包含无效操作码的请求,则子系统必须返回 SRC_SUBICMD 错误代码。SRC 支持的有效操作码在 spc.h 文件中定义。也可以定义子系统特定的操作码。如果没有由 SRC 或您的子系统定义,操作码无效。请参阅对子系统编程以返回 SRC 错误数据包以了解更多信息。

注意:操作码 0-255 被保留给 SRC 使用。
处理 SRC 状态请求

子系统可能被请求提供三种类型的状态报告:长子系统状态、短子服务器状态和长子服务器状态。

注意:短子系统状态报表由 srcmstr 守护进程执行。这种类型报告的 Statcode 和答复状态值常量在 /usr/include/spc.h 文件中定义。“状态值常量”表列出需要的和建议的答复状态值代码。
答复状态值代码 
值 意义 子系统 子服务器 
SRCWARN 接收到停止请求。(将在 20 秒内被停止。) X X 
SRCACT 启动并激活。 X X 
SRCINAC 未激活。

SRCINOP 无效的。 X X 
SRCLOSD 结束。

SRCLSPN 正在结束过程中。

SRCNOSTAT 空闲。

SRCOBIN 打开,但是未激活。

SRCOPND 打开。

SRCOPPN 正在打开过程中。

SRCSTAR 启动。 

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];
};
使用 SUBSYSTEM 常量填充 objtype 字段以指示状态用于子系统,或者使用子服务器代码点以指示状态用于子服务器。 
使用 spc.h 文件中定义的 SRC 状态常量之一填充 status 字段。 
使用您希望显示为状态的 NLS 文本填充 objtext 字段。此字段必须为以 NULL 终止的字符串。 
使用子系统或应用 objtext 字段的子服务器的名称填充 objname 字段。此字段必须为以 NULL 终止的字符串。 

注意:子系统和请求者可以协商将其它子系统定义的信息发送回请求者。请参阅srcsrpy 连续数据包以了解关于这种类型响应的更多信息。
对子系统编程以发送答复数据包

子系统返回至 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 子例程向请求者返回一个数据包。

创建答复
要编写子系统答复,使用下列步骤:

使用适用的 SRC 错误代码填充 rtncode 字段。使用 SRC_SUBMSG 作为 rtncode 字段来返回子系统特定的 NLS 消息。 

使用 SUBSYSTEM 常量填充 objtype 字段以指示答复用于子系统,或者使用子服务器代码点以指示答复用于子服务器。 

使用子系统名称、子服务器类型或应用于答复的子服务器对象填充 objname 字段。
 
使用子系统特定的 NLS 消息填充 rtnmsg 字段。 

在 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。 
子系统接收到刷新请求时,子系统应该重新配置其本身。

给 SRC 定义子系统

子系统作为子系统对象被定义到 SRC 对象类。子服务器作为子服务器类型对象被定义在 SRC 配置数据库中。与每种对象类型关联的结构被预先定义在 sys/srcobj.h 文件中。

使用 mkssys 命令或 addssys 子例程创建子系统对象。使用 mkserver 命令创建子服务器类型对象。不需要使用配置命令和子例程指定所有可能的选项和参数。SRC 提供预先设置的缺省值。只必须指定必填的字段和任何希望使用其它值(非缺省值)的字段。请参阅“SRC 对象”的子系统对象类中的“子系统对象描述符和缺省值”表,获取子系统和子服务器缺省值的列表。

通过编写 shell 脚本,可以在命令行添加或修改描述符。也可以使用 C 接口添加或修改它们。命令和子例程可用于配置和修改 SRC 对象。

注意:提供的编程接口选项仅出于方便起见。
请在命令行使用以下命令:

mkssys 向 SRC 配置数据库添加子系统定义。 
mkserver 向 SRC 配置数据库添加子服务器定义。 
chssys 更改 SRC 配置数据库中的子系统定义。 
chserver 更改 SRC 配置数据库中的子服务器定义。 
rmssys 从 SRC 配置数据库除去子系统定义。 
rmserver 从 SRC 配置数据库除去子服务器定义。 

当使用 C 接口时,请使用以下子例程:

addssys 向 SRC 配置数据库添加子系统定义 
chssys 更改 SRC 配置数据库中的子系统定义 
defssys 使用缺省值初始化新的子系统定义 
delssys 从 SRC 配置数据库中删除现有的子系统定义 

注意:和 chssys 子例程一起运行的对象代码必须和组系统一起运行。 
getssys 从 SRC 配置数据库获取子系统定义 
getsubsvr 从 SRC 配置数据库获取子服务器定义 

mkssys 和 mkserver 命令内部调用 defssys 子例程以在添加或修改命令行中输入的任何值之前,确定子系统和子服务器的缺省值。

当 SRC 主程序或子系统程序需要检索 SRC 配置文件的数据时,使用 getssys 和 getsubsvr 子例程


其它 SRC 子例程列表

使用以下子例程对使用 SRC 的通信和由 SRC 控制的子系统进行编程:

src_err_msg 返回由 SRC 库例程遇到的 SRC 错误消息文本。 
(另见多线程安全版本 src_err_msg_r) 
srcsbuf 按可打印格式请求子系统的状态。 
另见多线程安全版本 srcsbuf_r) 
srcsrqt 发送消息或请求至子系统。 
(另见多线程安全版本 srcsrqt_r) 
srcstat 请求简短的子系统状态。 
另见多线程安全版本 srcstat_r) 
srcstathdr 获取 SRC 状态的标题文本。 
srcstattxt 获取 SRC 状态码的文本说明。 
(另见版本多线程安全版本 srcstattxt_r) 
srcstop 请求子系统终止。 
srcstrt 请求子系统启动。 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章