从CachéObjectScript例程调用非CachéObjectScript程序或函数。
大纲$ZF("function_name",args)
参数
- function_name 要调用的函数的名称。
- args 可选-传递给函数的一组参数值。
$ZF
函数的各种形式使可以从ObjectScript例程调用非ObjectScript程序(例如shell或操作系统命令)或函数。可以定义接口或链接到用Caché用其他语言编写的函数,并使用$ZF从ObjectScript例程调用它们。
$ZF
也可以用于:
- 生成一个子进程来执行程序或命令:
$ZF(-100)
。 - 加载动态链接库(DLL),然后从该库执行函数:
$ZF(–3)
,$ZF(–4)
,$ZF(–5)
,$ZF(–6)
。
$ZF
的这些实现将负数作为第一个参数。它们在各自的参考页中进行了描述。
function_name
要调用的函数的名称用引号引起来,或者为负数。
args
args参数的形式为:arg1,arg2,arg3,… argn。参数可以包括诸如如何传递参数的描述以及要调用的C函数的入口点之类的项。
注意
用$ZF
调用UNIX®系统服务
Caché支持与KaTeX parse error: Can't use function '\textcircled' in math mode at position 14: \html@mathml{\̲t̲e̲x̲t̲c̲i̲r̲c̲l̲e̲d̲{\scriptsize R}…ZF中设置警报处理程序。通过使用这些UNIX®函数,可以区分实际错误,
`中断和应重新启动的调用。
函数声明包含在cdzf.h中,并在下表中进行了描述:
声明 | 目标 | 注意 |
---|---|---|
int sigrtclr(); |
清除重试标志。 | 使用sigrtchk() 之前应调用一次 |
int dzfalarm(); |
建立新的SIGALRM处理程序。 | 在输入$ZF 时,先前的处理程序将自动保存。退出时,它将自动恢复。用户程序不应更改任何其他信号的处理。 |
int sigrtchk(); |
检查异步事件。 | 每当以下系统调用之一失败时应调用:open() , close() , read() , write() , ioctl() , pause() ,当进程接收到信号时失败的任何调用。它返回指示用户应采取的操作的代码:-1 =没有信号。检查I / O错误。请参见errno变量的内容。0 =其他信号。从中断点重新开始操作。1 = SIGINT /。使用SIGTERM“返回0”从$ZF 退出。系统会适当捕获这些信号。 |
在用于控制某些设备的典型$ZF
函数中,应编写如下代码:适当地编码这些信号。
IF ((fd = open(DEV_NAME, DEV_MODE)) < 0) {
; Set some flags
; Call zferror
; return 0;
}
如果进程收到信号,则开放系统调用可能会失败。通常,这种情况不是错误,应该重新启动操作。但是,根据信号,可能会采取其他措施。因此,要考虑所有可能性,请考虑使用以下C代码:
sigrtclr();
WHILE (TRUE) {
IF (sigrtchk() == 1) { return 1 or 0; }
IF ((fd = open(DEV_NAME, DEV_MODE)) < 0) {
switch (sigrtchk()) {
case -1:
/* 真实的设备错误 */
; 设置标志
Call zferror
return 0;
case 0:
/* 收到无害信号。重新开始。 */
; 继续;
case 1:
/* 试图终止JOB。 */
Do cleanup work
return 1 or 0;
}
}
ELSE { break; }
/* 处理正常情况的代码: */
/* open() 系统调用成功 */
请记住,除非通过dzfalarm()
,否则不得设置任何信号处理程序。
在编码系统之间转换字符串
Caché通过$ZF
参数类型t(或T)支持输入输出转换,可以使用以下格式指定:
Argument | Purpose |
---|---|
t | 指定当前进程I / O转换对象。 |
t// | 指定默认的进程I / O转换表名称。 |
t/name/ | 指定特定的I / O转换表名称。 |
$ZF
通过放置在以下C结构中的计数字节字符串将转换后的字符串传送到外部过程:
typedef struct zarray {
unsigned short len;
unsigned char data[1]; /* 1 is a dummy value */
} *ZARRAYP;
这也是用于b(或B)参数类型的结构。
以下$ZF示例函数执行往返转换:
#include cdzf.h
extern int trantest();
ZFBEGIN
ZFENTRY("TRANTEST","t/SJIS/ T/SJIS/",trantest)
ZFEND
int trantest(inbuf,outbuf);
ZARRAYP inbuf; /* 缓冲区,其中包含在传递给此函数之前从内部Caché编码转换为SJIS编码的字符串 */
ZARRAYP outbuf; /* 包含SJIS编码字符串的缓冲区,在将其传递回Caché环境之前,该字符串将转换回内部Caché编码 */
{
int i;
/* 从输入参数缓冲区一次复制一个字节到输出参数缓冲区 */
for (i = 0; i < inbuf->len; i++)
outbuf->data[i] = inbuf->data[i];
/* 设置输出参数缓冲区n中的数据字节数 */
outbuf->len = inbuf->len;
return 0; /* Return success */
}
注意:从概念上讲,数据流入和流出$ZF
外部过程,就好像外部过程是设备一样。 I / O转换的输出组件用于传递到外部过程的数据,因为数据“离开”了Caché环境。 I / O转换的输入组件用于从外部过程接收的数据,因为数据正在“进入”Caché环境。
如果未定义I / O转换的输出组件,并且应用程序尝试使用该I / O转换传递除空字符串以外的任何内容,则Caché返回错误,因为它不知道如何转换数据。
如果未定义I / O转换的输入组件,并且类型字符串的参数将该I / O转换与$ZF
输出参数关联,则Caché返回错误,因为具有未定义转换的输出参数是无目的的。
以零结尾并计数的Unicode字符串
$ZF
函数支持以零结尾的Unicode字符串和计数的Unicode字符串的参数类型。即使在内部不使用Unicode字符的Caché版本中也支持这些功能。
零终止的Unicode字符串和计数的Unicode字符串的参数类型具有以下代码:
Argument | Purpose |
---|---|
w | 指向以零结尾的Unicode字符串的指针。 |
s | 指向计数的Unicode字符串的指针。 |
对于这两种参数类型,Unicode字符的C数据类型都是无符号的缩写。指向以零结尾的Unicode字符串的指针声明如下:
unsigned short *p;
指向已计数的Unicode字符串的指针被声明为指向以下C结构的指针:
typedef struct zwarray {
unsigned short len;
unsigned short data[1]; /* 1 is a dummy value */
} *ZWARRAYP;
例如:
ZWARRAYP *p;
len字段包含Unicode字符数组的长度。
数据字段包含计数的Unicode字符串中的字符。 Unicode字符串的最大大小是$ZF
字符串的最大大小,这是一个可更新的配置参数,默认为32767。
每个Unicode字符长两个字节。在将Unicode字符串声明为输出参数时,考虑到这一点很重要,因为Caché保留了可能传回的最长字符串的空间。使用默认字符串大小时,单个Unicode字符串参数的总内存消耗计算如下:
最多32767个字符*每个字符2个字节=总65534个字节。
这接近为所有$ZF
参数分配的默认最大内存区域,即67584。该最大$ZF
堆区域也是可更新的配置参数。
错误信息
$ZF
堆区用完后,$ZF
发出错误。 $ZF
字符串堆栈用尽时,$ZF
发出错误。当$ZF
无法分配伙伴块时,它将发出<STORE>
错误。
从子进程和DLL执行
$ZF
函数可以将负数作为其第一个参数。这些负数指定支持产生的子进程和动态链接库(DLL)的功能。这些$ZF
函数中的每一个都在单独的参考页中进行介绍。