srcsrqt 子例程
用途
向子系统发送请求。
库
系统资源控制器库 (libsrc.a)
语法
#include <spc.h> srcsrqt(Host, SubsystemName, SubsystemPID,
RequestLength, SubsystemRequest, ReplyLength, ReplyBuffer, StartItAlso, Continued)
char * Host, * SubsystemName;
char * SubsystemRequest, * ReplyBuffer;
int SubsystemPID, StartItAlso, * Continued;
short RequestLength, * ReplyLength;
RequestLength, SubsystemRequest, ReplyLength, ReplyBuffer, StartItAlso, Continued)
char * Host, * SubsystemName;
char * SubsystemRequest, * ReplyBuffer;
int SubsystemPID, StartItAlso, * Continued;
short RequestLength, * ReplyLength;
描述
srcsrqt 子例程向子系统发送请求,等待响应,并向调用者返回一个或多个应答。 请求和应答的格式由调用者和子系统确定。
注: srcsrqt 子例程创建自己的套接字以向子系统发送请求。 此功能打开的套接字将保持打开状态,直到接收到错误或结束包为止。
srcsrqt 子例程返回两种类型的延续:
| 项 | 描述 |
|---|---|
| 无延续 | ReplyBuffer->srchdr.continued设置为 END 常量。 |
| 应答延续 | ReplyBuffer->srchdr.continued未设置为 END 常量,而是设置为由调用进程和子系统商定的正值。 将包返回给调用者。 |
参数
| 项 | 描述 |
|---|---|
| SubsystemPID | 子系统的进程标识。 |
| 主机 | 指定要在其上发送此子系统请求的外部主机。 如果主机为空,那么会将请求发送到本地主机上的子系统。 本地用户必须作为“root”用户运行。 必须配置远程系统以接受系统资源控制器的请求。 即 srcmstr 守护程序(请参阅 /etc/inittab)必须用 -r 标志启动,并且必须配置 /etc/hosts.equiv 或 .rhosts 文件以允许远程请求。 |
| SubsystemName | 指定要将此请求发送至的子系统的名称。 如果未指定 SubsystemPID. ,那么必须指定 SubsystemName |
| RequestLength | 指定要发送到子系统的请求的长度 (以字节计)。 此参数的最大值 (以字节计) 为 2000 字节。 |
| SubsystemRequest | 指向子系统请求包。 |
| ReplyLength | 指定要从子系统接收的应答的最大长度 (以字节计)。 从 srcsrqt 子例程返回时, ReplyLength 参数设置为子系统应答包的实际长度。 |
| ReplyBuffer | 指向用于从子系统接收应答包的缓冲区。 |
| StartItAlso | 指定子系统处于非活动状态时是否应启动。 当非零时,系统资源控制器 (SRC) 尝试启动非活动子系统,然后将请求传递给子系统。 |
| 已继续 | 指定对 srcsrqt 子例程的此调用是否是先前请求的延续。 如果 Continued 参数设置为 NEWREQUEST,那么将向子系统发送对它的请求,并通知子系统期望另一响应。 调用进程不应将 Continued 设置为除 NEWREQUEST以外的任何值。 子系统的最后一个响应将 Continued 设置为 END。 |
返回值
如果 srcsrqt 子例程成功,那么将返回值 SRC_OK 。
错误代码
如果下列一项或多项为 true ,那么 srcsrqt 子例程将失败:
| 项 | 描述 |
|---|---|
| SRC_BADSOCK | 由于套接字故障,无法将请求传递到子系统。 |
| SRC_CONT | 子系统使用信号。 请求无法完成。 |
| SRC_DMNA | SRC 守护程序未处于活动状态。 |
| src_inet_authorized_host | 本地主机不在远程 /etc/hosts.equiv 文件中。 |
| src_inet_invalid_host | 在远程主机上,本地主机未知。 |
| src_invalid_user | 用户不是 root 用户或组系统。 |
| SRC_MMRY | SRC 组件无法分配它所需的内存。 |
| SRC_NOCONTINUE | Continued 参数未设置为 NEWREQUEST,并且当前没有活动的延续。 |
| SRC_NORPLY | 请求等待响应时超时。 |
| SRC_NSVR | 该子 系统不是活动的。 |
| SRC_REQLEN2BIG | RequestLength 大于最大 2000 字节。 |
| SRC_SOCK | SRC 套接字通信存在问题。 |
| SRC_STPG | 该请求未传递到子系统。 子系统正在停止。 |
| SRC_UDP | 在 /etc/services 文件中未定义 SRC 端口。 |
| SRC_UHOST | 外部主机未知。 |
示例
- 要请求长子系统状态,请输入:
int cont=NEWREQUEST; int rc; short replen; short reqlen; struct { struct srchdr srchdr; struct statcode statcode[20]; } statbuf; struct subreq subreq; subreq.action=STATUS; subreq.object=SUBSYSTEM; subreq.parm1=LONGSTAT; strcpy(subreq.objname,"srctest"); replen=sizeof(statbuf); reqlen=sizeof(subreq); rc=srcsrqt("MaryC", "srctest", 0, reqlen, &subreq, &replen, &statbuf, SRC_NO, &cont);此条目获取子系统的长状态srctest于MaryC机器。 子系统一直发送状态包,直到statbuf.srchdr.cont=END.
- 要启动子服务器,请输入:
int cont=NEWREQUEST; int rc; short replen; short reqlen; struct { struct srchdr srchdr; struct statcode statcode[20]; } statbuf; struct subreq subreq; subreq.action=START; subreq.object=1234; replen=sizeof(statbuf); reqlen=sizeof(subreq); rc=srcsrqt("", "", 987, reqlen, &subreq, &replen, &statbuf, SRC_NO, &cont);此条目使用以下代码点启动子服务器:1234,但仅当子系统已处于活动状态时。
- 要启动子服务器和子系统,请输入:
int cont=NEWREQUEST; int rc; short replen; short reqlen; struct { struct srchdr srchdr; struct statcode statcode[20]; } statbuf; struct subreq subreq; subreq.action=START; subreq.object=1234; replen=sizeof(statbuf); reqlen=sizeof(subreq); rc=srcsrqt("", "", 987, reqlen, &subreq, &replen, &statbuf, SRC_YES, &cont);此条目使用以下代码点启动子服务器:1234.如果此子服务器所属的子系统未处于活动状态,那么将启动该子系统。
文件
| 项 | 描述 |
|---|---|
| /etc/services | 定义用于因特网服务的套接字和协议。 |
| /dev/SRC | 指定 AF_UNIX 套接字文件。 |
| /dev/.SRC-unix | 指定临时套接字文件位置。 |