第104章 Caché 函数大全 $ZF 函数 第104章 Caché 函数大全 $ZF 函数 大纲 描述 参数 注意

第104章 Caché 函数大全 $ZF 函数

从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é支持与ZF的UNIX®系统调用一起使用的错误检查功能。这些调用使可以检查异步事件并在`ZF中设置警报处理程序。通过使用这些UNIX®函数,可以区分实际错误,<CTRL-C>`中断和应重新启动的调用。

函数声明包含在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函数中的每一个都在单独的参考页中进行介绍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章