第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®函數,可以區分實際錯誤,
<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
函數中的每一個都在單獨的參考頁中進行介紹。