技術情報 - Server Express - 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
    

戻る

-----