文章目录
第104章 Caché 函数大全 $ZF 函数 - 大纲
-
- 参数
- 描述
- 参数
-
- function_name
- args
- 注意
-
- 用`$ZF`调用UNIX®系统服务
- 在编码系统之间转换字符串
- 以零结尾并计数的Unicode字符串
- 错误信息
- 从子进程和DLL执行
从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函数中的每一个都在单独的参考页中进行介绍。