第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é支持与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)支持输入输出转换,可以使用以下格式指定:

ArgumentPurpose
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字符串的参数类型具有以下代码:

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

已标记关键词 清除标记
限时福利1:原价 129 元,最后2天仅需 69 元!后天涨价至98元 限时福利2:购课进答疑群专享柳峰(刘运强)老师答疑服务 限时福利3:购课添加助教领取价值 800 元的编程大礼包 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课程设计】 课程分为四大篇,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 三、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页