Server Express 技術情報(FAQ)


C サブルーチンを INT/GNT から CALL する方法を教えてください

Server Expressでは、「呼び出し可能共有オブジェクト」というファイル形式が新たにサポートされました。これは、UNIXの共有オブジェクト (.so、.sl) でありながら、同時に COBOL言語のCALL文による動的ローディングを可能にするファイル形式です。これを使用すると、COBOL V4.1 J 以前の版では面倒であった COBOLからの Cルーチン呼び出しが簡略化されます。

以下にその方式を説明します:

1) 例として、以下のような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.
$


2) サブルーチン c_sub を CALLしています。第1パラメタは C の String型で受けるために、PIC X型で宣言しておき、末尾に X"00" (NULL文字) を付加しています。第2パラメタは C の int型で受けるために、USAGE COMP-5 で宣言し、BY VALUE で渡しています。

3) 呼ばれる 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);
}
$


4) これは COBOLから渡されたパラメタを printf()関数で表示しています。

5) Cサブルーチンを呼び出し可能共有ライブラリにリンクします。-z フラグは、通常の共有オブジェクトではなく、Server Expressランタイムシステムから動的ロード可能な「呼び出し可能共有オブジェクト」にリンクすることを指示します。

$ cob -z c_sub.c

これで、c_sub.so (HP-UXの場合は c_sub.sl) が作製されます。

6) COBOLメインを -u フラグで GNTにコンパイルします。

$ cob -u demoprg.cbl


7) 通常にCOBOLメインを実行すると、以下のように c_sub.so が動的にロードされ、実行されます。

$ cobrun demoprg.gnt
c_sub is called.
item_1 = ABCDE, item_2 = 1234
$


8) 次に、COBOLメインをアニメータ用に GNT へコンパイルします。

$ cob -ug demoprg.cbl


9) 通常にこの GNTコードをアニメートすると Cを CALLする部分も含めてデバッグできます。

$ anim demoprg.gnt