技術情報 - Server Express - Cサブルーチンを INT/GNTからCALLする
Server Expressでは、「呼び出し可能共有オブジェクト」というファイル形式が新たにサポートされました。これは、UNIXの共有オブジェクト (.so、.sl) でありながら、同時に COBOL言語のCALL文による動的ローディングを可能にするファイル形式です。これを使用すると、COBOL V4.1 J 以前の版では面倒であった COBOLからの Cルーチン呼び出しが簡略化されます。以下にその方式を説明します:
- 例として、以下のようなCOBOLプログラムを用意します。
$ cat demopgm.cbl IDENTIFICATION DIVISION. PROGRAM-ID. DEMOPGM. DATA DIVISION. WORKING-STORAGE SECTION. 01 ITEM-1 PIC X(10). 01 ITEM-2 PIC 9(9) USAGE COMP-5. PROCEDURE DIVISION. 1. MOVE "ABCDE" & X"00" TO ITEM-1. MOVE 1234 TO ITEM-2. CALL "c_sub" USING BY REFERENCE ITEM-1 BY VALUE ITEM-2. STOP RUN. $ - サブルーチン c_sub を CALLしています。第1パラメタは C の String型で受けるために、PIC X型で宣言しておき、末尾に X"00" (NULL文字) を付加しています。第2パラメタは C の int型で受けるために、USAGE COMP-5 で宣言し、BY VALUE で渡しています。
- 呼ばれる Cサブルーチンを以下のように用意します。
$ cat c_sub.c #include <stdio.h> c_sub(char *item_1, int item_2) { printf("c_sub is called.\n item_1 = %s, item_2 = %d\n", item_1, item_2); return(0); } $ - これは COBOLから渡されたパラメタを printf()関数で表示しています。
- Cサブルーチンを呼び出し可能共有ライブラリにリンクします。-z フラグは、通常の共有オブジェクトではなく、Server Expressランタイムシステムから動的ロード可能な「呼び出し可能共有オブジェクト」にリンクすることを指示します。
$ cob -z c_sub.c
これで、c_sub.so (HP-UXの場合は c_sub.sl) が作製されます。 - COBOLメインを -u フラグで GNTにコンパイルします。
$ cob -u demoprg.cbl
- 通常にCOBOLメインを実行すると、以下のように c_sub.so が動的にロードされ、実行されます。
$ cobrun demoprg.gnt c_sub is called. item_1 = ABCDE, item_2 = 1234 $
- 次に、COBOLメインをアニメータ用に GNT へコンパイルします。
$ cob -ug demoprg.cbl
- 通常にこの GNTコードをアニメートすると Cを CALLする部分も含めてデバッグできます。
$ anim demoprg.gnt