OpenVMS に関する特別な考慮事項
$ZF を使用して、OpenVMS システム・サービスを呼び出すことができます。CZF.M64 という名前のファイルにある、ObjectScript 以外の各ルーチンにインタフェースを定義します。また、$ZF を使用して、OpenVMS システム・サービス・ルーチンを呼び出し、DCL コマンド・プロシージャやその他の高水準言語のルーチンを呼び出すこともできます。
以下の項目について説明します。
-
CZF.M64 の使用 — コールアウト・コードの作成では C が優先言語ですが、.M64 マクロ・ファイルを使用することもできます。
-
特権レベルを上げる ZFPRIV の使用 — コールアウト関数に呼び出し元の通常の特権レベルだけでなく、SHARE 以外のすべての特権を与える ZFPRIV 文について説明します。
-
システム・サービスでの V リンクの使用 — "v" リンク・タイプで OpenVMS 記述子を渡すことによって、OpenVMS システム・サービスおよびライブラリ・ルーチンを呼び出す方法を説明します。
-
DSM に代わる $ZF 関数呼び出し — OpenVMS システムに付属している組み込み CZF.EXE コールアウト・ライブラリのコンテンツを説明します。
CZF.M64 の使用
コールアウト・コードを記述する優先言語は C ですが (“InterSystems コールアウト・ライブラリの作成” で説明されているように CZF.C ファイルを作成)、マクロ・ファイル (CZF.M64) を使用することもできます。C コンパイラがある場合、CZF.C を使用します。それ以外の場合、CZF.M64 を使用します。両方を使用することができません。
CZF.M64 ファイルを使用する際は、.SHOW コマンドと .END コマンドの間に、ZFENTRY 文のみを入力します。この文は、以下の形式にする必要があります。
ZFENTRY CALLNAME=name,LINKNAME=fname,ARGS=atype,PRIVS=priv
-
CALLNAME — NAME $ZF 関数呼び出しで、Caché が外部関数を呼び出す名前です。
-
LINKNAME — ユーザ記述の外部関数のエントリ・ポイント名です。CZF.C で使用する ZFENTRY 文のエントリ・ポイント引数に相当します。
-
ARGS — どのように引数を渡すかを記述した文字列です。CZF.C で使用する ZFENTRY 文の argtypes 引数に相当します (“ZFENTRY の argtypes” を参照)。
構造体と引数のプロトタイプ定義は、インクルード・ファイル cdzf.h にあります。インターシステムズの追加の内部定義もまた、ここで宣言されています。
-
PRIVS — 関数を上位特権レベルで実行させるには、“YES” を入力します。呼び出し関数と同じ特権レベルで関数を実行させるには、“NO” を入力します。
呼び出し形式が異なっても、これは C プログラムで使用される ZFENTRY 文と基本的に同じです (“ZFEntry テーブルの作成” を参照)。
CZF.M64 をアセンブルするため、以下のコマンドを DCL プロンプトから発行します。
$ MAC /ALPHA CZF.M64
特権レベルを上げる ZFPRIV の使用
ZFENTRY 文は、呼び出しプロセスの特権レベルで実行します。これに SHARE 特権以外のすべての特権を与える場合、ZFPRIV 文で外部関数を記述することができます。ZFPRIV 文は、名前と以下の引数リストの最後に追加されている引数 "privileges" 以外は、ZFENTRY 文と同じ形式です。
ZFPRIV("name","argtypes",entrypoint,privileges)
privileges 引数は、以下のいずれかになります。
-
PRIV — 関数は上位特権レベルで実行します。
-
NOPRIV — 関数は、呼び出しプロセスの特権レベルで実行します。
czf.c ファイルを OpenVMS と他のオペレーティング・システムの間で変更せずに移動できるようにするために、これらのマクロには以下の効果があります。
-
OpenVMS の ZFENTRY では、呼び出し元の通常の特権レベルで実行する $ZF 関数を定義します。これは、$ZF 関数が他のオペレーティング・システムで動作する方法です。
-
ZFPRIV では、プログラマが $ZF 関数を呼び出し元の特権レベルで実行するか、またはプロセスが Caché 内にあるときに持つ上位特権レベル (SHARE 以外のすべての特権) で実行するかを指定できます。
71 システム・サービスでの V リンクの使用
OpenVMS システム・サービスとライブラリ・ルーチンの呼び出しに対応するため、OpenVMS 記述子を "v" リンク・タイプを使用して渡すことができます。
struct dsc$descriptor s * | v | V | OpenVMS のみ: OpenVMS システム・サービスを呼び出すときに使用します。 |
この例では、OpenVMS 関数 LIB$TRIM_FILESPEC を ObjectScript に公開します。ObjectScript から、次の呼び出しが使用可能になります。
SET newfilespec=$ZF("TRIM FILESPEC",oldfilespec,width)
CZF インタフェースは 32 の実パラメータをそれが呼び出すすべての関数に渡します。32 の実パラメータよりも少ない場合は、それらのパラメータに対して NULL が渡されます。LIB$TRIM_FILESPEC は、多くのライブラリおよびシステム関数と同様に実パラメータの数をカウントするため、簡単なラッパ関数を宣言する必要があります。
#ifdef __VMS
ZFENTRY("TRIM_FILESPEC","viV",trim_filespec)
#endif
ラッパ関数を以下に示します。
#ifdef __VMS
int trim_filespec(struct dsc$descriptor_s*oldfilespec,int width,struct dsc$descriptor_s*newfilespec){
short int resultwidth;
int s;
if(width> ZFString)return ZF_FAILURE;
s= LIB$TRIM_FILESPEC(oldfilespec,newfilespec,&width,&resultwidth);
newfilespec->dsc$w_length= resultwidth;
return s;
}
#endif
DSM に代わる $ZF 関数呼び出し
このセクションでは、DSM VMS システム・サービスの Zcall 関数をエミュレートするための $ZF 関数の引数として提供できる、Caché 提供の (内部) 関数について説明します。これらの関数は、標準 CZF.EXE コールアウト・イメージに含まれます。このイメージのカスタマイズの詳細は、“OpenVMS でのカスタム CZF.EXE ファイルの作成” を参照してください。
以下の内部関数について説明します。
-
GETJPI — ジョブおよびプロセス情報を取得します。
-
GETDVI — デバイス特性を取得します。
-
GETSYI — システム情報を取得します。
-
SETSYM — DCL シンボル値を設定します。
-
GETSYM — DCL シンボル値を返します。
-
DELSYM — DCL シンボル値を削除します。
-
CRELOG — 論理名を作成します。
-
TRNLNM — 論理名を変換します。
-
DELLOG — 論理名を削除します。
-
GETUAI — アカウントの承認パラメータを返します。
-
GETMSG — ステータス・コードのメッセージ・テキストを返します。
-
SETPRN — 呼び出しプロセスの名前を設定します。
-
SETPRI — プロセスのベース優先度を設定します。
-
OPCOM — オペレータにメッセージを送信します。
-
MOUNT — デバイスをマウントします。
-
DISMOUNT — デバイスをディスマウントします。
-
DIRECTORY — 既定のディレクトリを返します。
-
PARSE — ファイル名を解析します。
-
GETFILE — ファイル情報を返します。
$ZF 内部関数
内部関数はすべて、関数名とその後に続くその他のパラメータのみを指定することによって $ZF で呼び出すことができます。以下は、GETUAI を関数として使用する例です。
SET x = $ZF("GETUAI","FRED","USERNAME")
ここでは、関数名はすべて大文字で表記されていますが、実際には大文字と小文字は区別されません。
GETJPI
ジョブおよびプロセス情報を返します。
SET x = $ZF("GETJPI",pid,item)
SET x = $ZF("GETJPI",,item,procname)
-
pid — プロセス ID (10 進数)
-
item — 返すプロセス情報の項目コード
-
procname — プロセス名 (pid の代わりに使用)
ACCOUNT | DFPFC | IMAGECOUNT | PHDFLAGS | TMBU |
APTCNT | DFWSCNT | IMAGNAME | PID | TQCNT |
ASTACT | DIOCNT | IMAGPRIV | PPGCNT | TQLM |
ASTCNT | DIOLM | JOBPRCCNT | PRCCNT | TT_ACCPORNAM |
ASTEN | DIRIO | JOBTYPE | PRCLM | TT_PHYDEVNAM |
ASTLM | EFCS | LOGINTIM | PRCNAM | UAF_FLAGS |
AUTHPRI | EFCU | MASTER_PID | PRI | UIC |
AUTHPRIV | EFWM | MAXDETACH | PRIB | USERNAME |
BIOCNT | ENQCNT | MAXJOBS | PROC_INDEX | VIRTPEAK |
BIOLM | ENQLM | MEM | PROCPRIV | VOLUMES |
BUFIO | EXCVEC | MODE | SCHED_POLICY | VP_CONSUMER |
BYTCNT | FAST_VP_SWITCH | MSGMASK | SHRFILLM | VP_CPUTIM |
BYTLM | FILCNT | NODENAME | SITESPEC | WSAUTH |
CLINAME | FILLM | NODE_CSID | SLOW_VP_SWITCH | WSAUTHEXT |
CPU_ID | FINALEXC | NOD_VERSION | STATE | WSEXTENT |
CPULIM | FREP0VA | OWNER | STS | WSPEAK |
CPUTIM | FREP1VA | PAGEFLTS | STS2 | WSQUOTA |
CREPRC | FREPTECNT | PAGFILCNT | SWPFILLOC | WSSIZE |
FLAGS | GPGCNT | PAGFILLOC | TABLENAME | |
CURPRIV | GRP | PGFLQUOTA | TERMINAL |
GETDVI
デバイス特性を返します。
SET x = $ZF("GETDVI",devname,item,flag)
-
devname — 物理デバイス名、または物理デバイス名と同等の論理デバイス名
-
item — 返すプロセス情報の項目コード
-
flag — 1 は 1 次的な特性、2 は 2 次的な特性、既定値は 2 です。
ACPTYPE | EXISTS | PID | TT_AUTOBAUD | TT_MODHANGUP |
ALL | FOD | RCK | TT_AVO | TT_NOBRDCST |
ALLDEVNAM | FOR | RCT | TT_BLOCK | TT_NOECHO |
ALLOCLASS | FREEBLOCKS | REC | TT_BRDCSTMBX | TT_NOTYPEAHD |
ALT_HOST_AVAIL | FULLDEVNAM | RECSIZ | TT_CRFILL | TT_OPER |
ALT_HOST_NAME | GEN | REFCNT | TT_DECCRT | TT_PAGE |
ALT_HOST_TYPE | HOST_AVAIL | REMOTE_DEVICE | TT_DECCRT2 | TT_PASTHRU |
AVL | HOST_COUNT | RND | TT_DIALUP | TT_PHYDEVNAM |
CCL | HOST_NAME | ROOTDEVNAM | TT_DISCONNECT | TT_PRINTER |
CLUSTER | HOST_TYPE | RTM | TT_DMA | TT_READSYNC |
CONCEALED | IDV | SDI | TT_DRCS | TT_REGIS |
CYLINDERS | LOCKID | SECTORS | TT_EDIT | TT_REMOTE |
DEVBUFSIZ | LOGVOLNAM | SERIALNUM | TT_EDITING | TT_SCOPE |
DEVCHAR | MAXBLOCK | SERVED_DEVICE | TT_EIGHTBIT | TT_SECURE |
DEVCHAR2 | MAXFILES | SHR | TT_ESCAPE | TT_SETSPEED |
DEVCLASS | MBX | SPL | TT_FALLBACK | TT_SIXEL |
DEVDEPEND | MEDIA_ID | SPLDEVNAM | TT_HALFDUP | TT_SYSPWD |
DEVDEPEND2 | MEDIA_NAME | SQD | TT_HANGUP | TT_TTSYNC |
DEVLOCKNAM | MEDIA_TYPE | STS | TT_HOSTSYNC | TT_WRAP |
DEVNAM | MNT | SWL | TT_INSERT | UNIT |
DEVSTS | MOUNTCNT | TRACKS | TT_LFFILL | VOLCOUNT |
DEVTYPE | NET | TRANSCNT | TT_LOCALECHO | VOLNAM |
DIR | NEXTDEVNAM | TRM | TT_LOWER | VOLNUMBER |
DMT | ODV | TT_ACCPORNAM | TT_MBXDSABL | VOLSETMEM |
DUA | OPCNT | TT_ALTYPEAHD | TT_MECHFORM | VPROT |
ELG | OPR | TT_ANSICRT | TT_MECHTAB | WCK |
ERRCNT | OWNUIC | TT_APP_KEYPAD | TT_MODEM |
GETSYI
システム情報を返します。
SET x = $ZF("GETSYI",item,csid[,nodename])
-
item — 引用符付きの文字列として指定される、返すシステム・パラメータ値の項目キーワード・コード
-
csid — 情報を取得するクラスタ・メンバのノード CSID (クラスタ・ノード ID) パラメータ。
すべてのクラスタ・ノードを検索する場合は -1 を指定します。csid に-1 を指定した以降の各呼び出しでは、クラスタ内の次のノードの item キーワード情報が返されます。すべてのノードの順次処理が完了すると、空文字列 ("") が返されます。csid に -1 以外の値を指定すると、ノードへの順次アクセスが終了します。
オプションの nodename パラメータを指定する場合は (プレースホルダとして) 0 を指定します。
-
nodename — オプション — 引用符付きの文字列として指定されるクラスタ・ノード。クラスタ・ノードは nodename または csid によって指定できます。クラスタ・ノードを nodename によって指定するときは、csid に値 0 を指定します。
ACTIVECPU_CNT | CLUSTER_FTIME | FREE_GBLPAGES | PAGEFILE_FREE | PQL_MFILLM |
ARCHFLAG | CLUSTER_MEMBER | FREE_GBLSECTS | PAGEFILE_PAGE | PQL_MENQLM |
ARCH_NAME | CLUSTER_NODES | GBLPAGES | PQL_DWSDEFAULT | SCSNODE |
ARCH_TYPE | CLUSTER_QUORUM | GBLPAGFIL | PQL_DWSEXTENT | SPTREQ |
AVAILCPU_CNT | CPU | GBLSECTIONS | PQL_DWSQUOTA | SRPCOUNTV |
BALSETCNT | CONTIG_GBLPAGES | LOCKIDTBL | PQL_MWSDEFAULT | SWAPFILE_FREE |
BJOBLIM | CPUTYPE | LOCKIDTBL_MAX | PQL_MWSEXTENT | SWAPFILE_PAGE |
BOOTTIME | DECIMAL_EMULATED | MAXPROCESSCNT | PQL_MWSQUOTA | VERSION |
CHARACTER_EMULATED | D_FLOAT_EMULATED | MAXSYSGROUP | PQL_MASTLM | VIRTUALPAGECNT |
CLUSTER_EVOTES | HW_MODEL | NODENAME | PQL_MBYTLM | WSMAX |
CLUSTER_FSYSID | HW_NAME | NODE_CSID | PQL_MDIOLM |
SETSYM
特定の値に DCL シンボルを設定します。DCL シンボルはローカル、グローバルのどちらでもかまいません。SETSYM は NULL 文字列を返します。
SET x = $ZF("SETSYM",symbol,value,flag)
-
symbol — 設定する DCL シンボル
-
value — DCL シンボルの値
-
flag — 1 はローカル、2 はグローバル、既定値は 1 です。
GETSYM
指定された DCL シンボルの値を返します。DCL シンボルはローカル、グローバルのどちらでもかまいません。flag 値の 1 を使用して、シンボル・タイプを決定できます。DCL 値は、SETSYM 関数によって設定されます。
SET x = $ZF("GETSYM",symbol[,flag])
-
symbol — 値を返す DCL シンボル
-
flag — オプション — ブーリアン値。1 を指定すると、未定義シンボルには 0、ローカル・テーブルには 1、グローバル・テーブルには 2 を返します。0 を指定すると、シンボル値を返します。既定値は 0 です。
DELSYM
指定された DCL シンボルの値を削除します。DCL シンボルはローカル、グローバルのどちらでもかまいません。DCL 値は、SETSYM 関数によって設定されます。
SET x = $ZF("DELSYM",symbol,flag)
-
symbol — 設定する DCL シンボル
-
flag — 1 はローカル、2 はグローバル、既定値は 1 です。
CRELOG
指定されたモードの指定された論理名テーブルに論理名を作成します。既定では、type=USER モードおよび table= プロセスの論理名テーブルです。CRELOG は NULL 文字列を返します。
SET x = $ZF("CRELOG",logname,value[,type[,table]])
-
logname — 作成する論理名
-
value — 論理名と同等の文字列
-
type — オプション — 定義するテーブル・モード。使用できる値の詳細は以下のとおりです。既定は USER モード。
-
table — オプション — ユーザ定義の論理名テーブルの名前。type=TABLE の場合、table 値が必要です。既定はプロセスの論理名テーブル。
使用可能な type の値は、以下のとおりです。
-
USER = プロセス・テーブル/USER モード
-
SUPERVISOR または PROCESS = プロセス・テーブル/Supervisor モード
-
JOB = ジョブ・テーブル — LNM$JOB
-
GROUP = グループ・テーブル — LNM$GROUP
-
SYSTEM = システム・テーブル — LNM$SYSTEM
-
TABLE = ユーザ定義の論理名テーブルの名前
TRNLNM
論理名を変換し、同等の名前文字列または要求された属性を返します。一致が検出されない場合、TRNLNM は NULL 文字列を返します。
SET x = $ZF("TRNLNM",logname,table,index,acmode,trans,item)
-
logname — 作成する論理名
-
table — ユーザ定義の論理名テーブルの名前。既定はプロセスの論理名テーブル。
-
index — 複数変換の場合の論理名のインデックス
-
acmode — アクセス・モード。使用可能な値は、USER、SUPERVISOR、EXECUTIVE、および KERNEL。
-
trans — 大文字/小文字変換のタイプ。利用可能な値は CASE_BLIND および CASE_SENSITIVE。
-
item — 返す論理名に関する情報のタイプ。使用可能な値は、ACCESS_MODE、CONCEALED、CONFINE、CRELOG、LENGTH、MAX_INDEX、NO_ALIAS、TABLE、TABLE_NAME、TERMINAL、および VALUE。
DELLOG
指定された論理名テーブルの論理名を削除します。
SET x = $ZF("DELLOG",logname,type,table)
-
logname — 作成する論理名
-
type — 論理名のタイプ
-
table — ユーザ定義の論理名テーブルの名前。既定はプロセスの論理名テーブル。
GETUAI
特定の OpenVMS アカウントの承認パラメータの値を返します。
SET x = $ZF("GETUAI",account,item)
-
account — アカウント名
-
item — 項目コード
ACCOUNT | DFWSCNT | LASTLOGIN_N | PGFLQUOTA | UIC |
ASTLM | DIOLM | LGICMD | PRCCNT | USERNAME |
BIOLM | ENQLM | MAXACCTJOBS | PRI | WSEXTENT |
BYTLM | FILLM | MAXDETACH | PRIV | WSQUOTA |
DEFDEV | FLAGS | MAXJOBS | QUEPRI | |
DEFDIR | JTQUOTA | OWNER | SHRFILLM | |
DEF_PRIV | LASTLOGIN_I | PBYTLM | TQCNT |
GETMSG
指定されたステータス・コードに対応するメッセージ・テキストを返します。
SET x = $ZF("GETMSG",code)
-
code — エラーのステータス・コード
SETPRN
呼び出し元のプロセスの名前を、指定された OpenVMS プロセス名に設定します。
SET x = $ZF("SETPRN",pname)
-
pname — 有効な OpenVMS プロセス名
SETPRI
指定されたプロセスのベース優先度を設定します。対象プロセスは CACHE イメージを実行している必要があります。
SET x = $ZF("SETPRI",pri,pid)
-
pri — 0 から 15 までの整数 (0 と 15 を含む) で指定されるプロセスのベース優先度
-
pid — プロセス ID (10 進数)
OPCOM
指定されたメッセージをオペレータのターミナルに送信します。その結果、NULL 文字列を返します。
SET x = $ZF("OPCOM",msg)
-
msg — オペレータのターミナルに送信するメッセージ文字列
MOUNT
指定されたデバイスをマウントします。この関数は、LIB$SPAWN を呼び出して、DCL コマンドの MOUNT を発行します。
SET x = $ZF("MOUNT",devnam,label,options,lognam)
-
devnam — デバイス名
-
label — デバイス・ラベル
-
options — DCL ディクショナリに指定されている 1 つ以上のマウント・オプション
-
lognam — デバイスに割り当てる論理名
DISMOUNT
指定されたデバイスをディスマウントします。この関数は、LIB$SPAWN を呼び出して、DCL コマンドの DISMOUNT を発行します。
SET x = $ZF("DISMOUNT",devnam,options)
-
devnam — デバイス名
-
options — DCL ディクショナリに指定されている 1 つ以上のディスマウント・オプション
DIRECTORY
現在の OpenVMS 既定ディレクトリを返します。また、オプションとして、OpenVMS 既定ディレクトリを指定されたディレクトリに設定します。
SET x = $ZF("DIRECTORY",dir)
-
dir — 新しいディレクトリ名
PARSE
指定されたファイル名を解析し、解析されたファイル名を返します。PARSE は RMS $PARSE サービスを呼び出します。
SET x = $ZF("PARSE",filename,defname,relname,keyword,flag)
-
filename — 解析するファイル名
-
defname — 既定のファイル名
-
relname — 関連付けられたファイル名
-
keyword — 解析されたファイル名から返すフィールド値を指定します。使用可能な値は、NODE、DEVICE、DIRECTORY、NAME、TYPE、および VERSION。
-
flag — I/O チェックを行うかどうかを指定するフラグ。1 は I/O チェックを行いません、0 は I/O チェックを行います。既定値は 0 です。
GETFILE
指定されたファイルに関する情報を返します。この関数は、同じキーワードを使用して、F$FILE_ATTRIBUTES 字句関数をエミュレートします。GETFILE は、OpenVMS の標準フォーマットで UIC を返し、True を 1、False を 0 として返します。
SET x = $ZF("GETFILE",filename,keyword)
-
filename — ファイルの名前
-
keyword — 対象ファイルから返す属性を指定します。
ALQ | DEQ | GBC | NOK | RVN |
BDT | DID | IBS | ORG | SIZ |
BKS | DVI | LRL | PRO | UIC |
BLS | EDT | LVL | PVN | WCK |
CBT | EOF | MBM | RAT | |
CDT | FID | MRN | RCK | |
CTG | FSZ | MRS | RDT | |
DBS | GRP | NOA | RFM |