5.4.2 マルチスレッド対応のユーザアプリケーションプログラムの作成
マルチスレッドで動作するUAPをCOBOL言語で作成する方法について,説明します。
(1) 翻訳
COBOL言語で作成したUAPのソースプログラムの翻訳について,説明します。このUAPのソースプログラムには,スレッド起動プログラム,CUPの主プログラムなどが必要です。
スレッド起動プログラムはC言語で記述し,Cコンパイラで翻訳してオブジェクトファイルを作成します。また,CUPの主プログラムはCOBOL言語で作成し,COBOLコンパイラで翻訳してオブジェクトファイルを作成します。
それぞれのプログラムを翻訳するときのコマンド入力例を次に示します。なお,COBOLコンパイラには,COBOL2002を使用した場合の例を示します。
- 〈例〉
-
C言語で作成したスレッド起動プログラム
-
thdcup_main.c
COBOL言語で作成したCUPの主プログラム
-
sample.cbl
この場合,それぞれのソースプログラムは次のように翻訳します。
cc -c -I/usr/include -ansi thdcup_main.c ccbl2002 -MultiThread -Compile,NoLink sample.cbl
- 注
-
翻訳環境のロケールがUTF-8の場合,ccbl2002のオプションに-UniObjGenも追加してください。
上記のccコマンドおよびccbl2002コマンドを実行すると,次のオブジェクトファイルが作成されます。
-
thdcup_main.o(スレッド起動プログラムのオブジェクトファイル)
-
sample.o(CUPの主プログラムのオブジェクトファイル)
-
(2) 結合
COBOL言語で作成したUAPの実行形式ファイルの作成には,ccbl2002コマンドまたはccコマンドを使用する方法があります。それぞれの場合の結合方法について,説明します。
(a) ccbl2002コマンドを使用する場合
ccbl2002コマンドを使用してUAPの実行形式ファイルを作成する場合,次に示すファイルを結合させて作成します。
-
スレッド起動プログラムのオブジェクトファイル
-
CUPの主プログラムのオブジェクトファイル
-
TP1/Client/Wのライブラリ
-
COBOL2002のライブラリ
-
POSIXスレッドのライブラリ
ccbl2002コマンドを使用して,上記のファイルを結合するときのコマンドの入力例を次に示します。
- 〈例〉
-
COBOL CUP実行形式ファイル「example」を作成する場合
-
スレッド起動プログラムのオブジェクトファイル名…thdcup_main.o
-
CUPの主プログラムのオブジェクトファイル名…sample.o
次のようにファイルを結合させます。
ccbl2002 sample.o thdcup_main.o -L/usr/lib -lclt -lpthread -L/opt/HILNGcbl2k/lib -lcbl2kml -lcbl2kmp -OutputFile example
-
(b) ccコマンドを使用する場合
ccコマンドを使用してUAPの実行形式ファイルを作成する場合,次に示すファイルを結合させて作成します。
-
スレッド起動プログラムのオブジェクトファイル
-
CUPの主プログラムのオブジェクトファイル
-
TP1/Client/Wのライブラリ
-
COBOL2002のライブラリ
-
POSIXスレッドのライブラリ
ccコマンドを使用して,上記のファイルを結合するときのコマンドの入力例を次に示します。
- 〈例〉
-
COBOL CUP実行形式ファイル「example」を作成する場合
-
スレッド起動プログラムのオブジェクトファイル名…thdcup_main.o
-
CUPの主プログラムのオブジェクトファイル名…sample.o
次のようにファイルを結合させます。
cc -o example thdcup_main.o sample.o -L/usr/lib -lclt -lpthread -L/opt/HILNGcbl2k/lib -lcbl2k -lcbl2kml -lcbl2kmp
-
(3) スレッド起動プログラムおよびCUPの主プログラムのコーディング例
COBOL言語で作成したUAPのスレッド起動プログラム(C言語),およびCUPの主プログラム(COBOL言語)のコーディング例を示します。
(a) スレッド起動プログラム(C言語)のコーディング例
000010 #include <stdio.h> 000020 #include <pthread.h> 000030 #include <sys/errno.h> 000040 000050 #define THDMAX 5 000060 000070 extern void *CUP_THREAD(); 000080 000090 main() 000100 { 000110 int i; 000120 int rc; 000130 int *exit_value; 000140 pthread_t threads[THDMAX]; 000150 000160 /*--- スレッドを生成する ---*/ 000170 for (i = 1; i < THDMAX; i++) { 000180 fflush(stdout); 000190 rc = pthread_create((pthread_t *)&threads[i], 000200 NULL, 000210 CUP_THREAD, 000220 (void *)&i); 000230 if (rc < 0) { 000240 printf("cup0: pthread_create に失敗しました。CODE=%d\n", errno); 000250 } 000260 } 000270 000280 /*--- スレッドの終了を待ち合わせる ---*/ 000290 for (i = 1; i < THDMAX; i++) { 000300 rc = pthread_join(threads[i], (void **)&exit_value); 000310 if (rc < 0) { 000320 printf("cup0: pthread_join に失敗しました。CODE=%d\n", errno); 000330 } 000340 } 000350 000360 } 000370
(b) CUPの主プログラム(COBOL言語)のコーディング例
000010 * 000020 ************************************************** 000030 * CUPサンプルプログラム * 000040 ************************************************** 000050 * 000060 IDENTIFICATION DIVISION. 000070 PROGRAM-ID. CUP_THREAD. 000080 * 000090 ************************************************** 000100 * データ領域の設定 * 000110 ************************************************** 000120 * 000130 DATA DIVISION. 000140 WORKING-STORAGE SECTION. 000150 01 DCCLS-CLTIN-ARG. 000160 02 DCCLS-CLTIN-REQUEST PIC X(8) VALUE 'CLTIN '. 000170 02 DCCLS-CLTIN-STATUS-CODE PIC X(5). 000180 02 FILLER PIC X(3). 000190 02 DCCLS-CLTIN-FLAGS PIC S9(9) COMP VALUE ZERO. 000200 02 DCCLS-CLTIN-T-HOST PIC X(64). 000210 02 DCCLS-CLTIN-LOGNAME PIC X(16). 000220 02 DCCLS-CLTIN-PASSWD PIC X(16). 000230 02 DCCLS-CLTIN-S-HOST PIC X(64). 000240 02 DCCLS-CLTIN-HWND PIC 9(4) COMP. 000250 02 FILLER PIC X(2). 000260 02 DCCLS-CLTIN-CLTID PIC 9(18) COMP. 000270 02 DCCLS-CLTIN-DEFPATH PIC X(256). 000280 * 000290 01 DCCLS-CLTOUT-ARG. 000300 02 DCCLS-CLTOUT-REQUEST PIC X(8) VALUE 'CLTOUT '. 000310 02 DCCLS-CLTOUT-STATUS-CODE PIC X(5). 000320 02 FILLER PIC X(3). 000330 02 DCCLS-CLTOUT-FLAGS PIC S9(9) COMP VALUE ZERO. 000340 02 FILLER PIC X(4). 000350 02 DCCLS-CLTOUT-CLTID PIC 9(18) COMP. 000360 * 000370 01 DCRPS-OPEN-ARG1. 000380 02 DCRPS-OPEN-REQUEST PIC X(8) VALUE 'OPEN '. 000390 02 DCRPS-OPEN-STATUS-CODE PIC X(5). 000400 02 FILLER PIC X(3). 000410 02 DCRPS-OPEN-FLAGS PIC S9(9) COMP VALUE ZERO. 000420 02 FILLER PIC X(4). 000430 02 DCRPS-OPEN-CLTID PIC 9(18) COMP. 000440 * 000450 01 DCRPS-OPEN-ARG2. 000460 02 FILLER PIC X(1). 000470 * 000480 01 DCRPS-OPEN-ARG3. 000490 02 FILLER PIC X(1). 000500 * 000510 01 DCRPS-CALL-ARG1. 000520 02 DCRPS-CALL-REQUEST PIC X(8) VALUE 'CALL '. 000530 02 DCRPS-CALL-STATUS-CODE PIC X(5). 000540 02 FILLER PIC X(3). 000550 02 DCRPS-CALL-FLAGS PIC S9(9) COMP VALUE ZERO. 000560 02 DCRPS-CALL-DESCRIPTER PIC S9(9) COMP. 000570 02 DCRPS-CALL-SVGROUP PIC X(32). 000580 02 DCRPS-CALL-SVNAME PIC X(32). 000590 02 DCRPS-CALL-CLTID PIC 9(18) COMP. 000600 * 000610 01 DCRPS-CALL-ARG2. 000620 02 DCRPS-CALL-INDATALEN PIC S9(9) COMP. 000630 02 DCRPS-CALL-INDATA PIC X(512). 000640 * 000650 01 DCRPS-CALL-ARG3. 000660 02 DCRPS-CALL-OUTDATALEN PIC S9(9) COMP. 000670 02 DCRPS-CALL-OUTDATA PIC X(512). 000680 * 000690 01 DCRPS-CLOSE-ARG1. 000700 02 DCRPS-CLOSE-REQUEST PIC X(8) VALUE 'CLOSE '. 000710 02 DCRPS-CLOSE-STATUS-CODE PIC X(5). 000720 02 FILLER PIC X(3). 000730 02 DCRPS-CLOSE-FLAGS PIC S9(9) COMP VALUE ZERO. 000740 02 FILLER PIC X(4). 000750 02 DCRPS-CLOSE-CLTID PIC 9(18) COMP. 000760 * 000770 01 DCRPS-CLOSE-ARG2. 000780 02 FILLER PIC X(1). 000790 * 000800 01 DCRPS-CLOSE-ARG3. 000810 02 FILLER PIC X(1). 000820 * 000830 ************************************************** 000840 * CUPの開始 * 000850 ************************************************** 000860 PROCEDURE DIVISION. 000870 MAIN SECTION. 000880 PROG-START. 000890 * 000900 ************************************************** 000910 * クライアントユーザの認証要求 * 000920 ************************************************** 000930 MOVE 'CLTIN ' TO DCCLS-CLTIN-REQUEST IN DCCLS-CLTIN-ARG. 000940 MOVE ZERO TO DCCLS-CLTIN-FLAGS IN DCCLS-CLTIN-ARG. 000950 MOVE 'host01:10000' TO DCCLS-CLTIN-T-HOST 000960 IN DCCLS-CLTIN-ARG. 000970 MOVE 'user01' TO DCCLS-CLTIN-LOGNAME IN DCCLS-CLTIN-ARG. 000980 MOVE 'puser01' TO DCCLS-CLTIN-PASSWD IN DCCLS-CLTIN-ARG. 000990 MOVE ZERO TO DCCLS-CLTIN-HWND IN DCCLS-CLTIN-ARG. 001000 MOVE SPACE TO DCCLS-CLTIN-DEFPATH IN DCCLS-CLTIN-ARG. 001010 * 001020 * ******************************* 001030 CALL 'CBLDCCLS' USING DCCLS-CLTIN-ARG. 001040 * ******************************* 001050 IF DCCLS-CLTIN-STATUS-CODE IN DCCLS-CLTIN-ARG NOT = '00000' 001060 THEN 001070 DISPLAY 'CUP01: CBLDCCLS(CLTIN)に失敗しました。CODE=' 001080 DCCLS-CLTIN-STATUS-CODE IN DCCLS-CLTIN-ARG 001090 GO TO PROG-EXIT 001100 END-IF. 001110 * 001120 ************************************************** 001130 * RPC-OPEN(RPC環境の初期設定) * 001140 ************************************************** 001150 MOVE 'OPEN ' TO 001160 DCRPS-OPEN-REQUEST IN DCRPS-OPEN-ARG1. 001170 MOVE ZERO TO DCRPS-OPEN-FLAGS 001180 IN DCRPS-OPEN-ARG1. 001190 MOVE DCCLS-CLTIN-CLTID IN DCCLS-CLTIN-ARG TO 001200 DCRPS-OPEN-CLTID IN DCRPS-OPEN-ARG1. 001210 * 001220 * ******************************* 001230 CALL 'CBLDCRPS' USING DCRPS-OPEN-ARG1 DCRPS-OPEN-ARG2 001240 DCRPS-OPEN-ARG3. 001250 * ******************************* 001260 IF DCRPS-OPEN-STATUS-CODE IN DCRPS-OPEN-ARG1 NOT = '00000' 001270 THEN 001280 DISPLAY 'CUP01: CBLDCRPS(OPEN)に失敗しました。CODE=' 001290 DCRPS-OPEN-STATUS-CODE IN DCRPS-OPEN-ARG1 001300 GO TO PROG-END 001310 END-IF. 001320 * 001330 * ********************************************* 001340 * * RPC-CALL(RPCの実行) * 001350 * ********************************************* 001360 MOVE 'CALL ' TO 001370 DCRPS-CALL-REQUEST IN DCRPS-CALL-ARG1. 001380 MOVE ZERO TO 001390 DCRPS-CALL-FLAGS IN DCRPS-CALL-ARG1. 001400 MOVE 'spp01' TO 001410 DCRPS-CALL-SVGROUP IN DCRPS-CALL-ARG1. 001420 MOVE 'svr01' TO 001430 DCRPS-CALL-SVNAME IN DCRPS-CALL-ARG1. 001440 MOVE DCCLS-CLTIN-CLTID IN DCCLS-CLTIN-ARG TO 001450 DCRPS-CALL-CLTID IN DCRPS-CALL-ARG1. 001460 MOVE 'HELLO SPP !! ' TO 001470 DCRPS-CALL-INDATA IN DCRPS-CALL-ARG2. 001480 MOVE 512 TO 001490 DCRPS-CALL-INDATALEN IN DCRPS-CALL-ARG2. 001500 MOVE SPACE TO 001510 DCRPS-CALL-OUTDATA IN DCRPS-CALL-ARG3. 001520 MOVE 512 TO 001530 DCRPS-CALL-OUTDATALEN IN DCRPS-CALL-ARG3. 001540 * 001550 * ************************************************** 001560 CALL 'CBLDCRPS' USING DCRPS-CALL-ARG1 DCRPS-CALL-ARG2 001570 DCRPS-CALL-ARG3 001580 * ************************************************** 001590 IF DCRPS-CALL-STATUS-CODE IN DCRPS-CALL-ARG1 NOT = '00000' 001600 THEN 001610 DISPLAY 'CUP01: CBLDCRPS(CALL)に失敗しました。' 001620 'CODE=' DCRPS-CALL-STATUS-CODE IN DCRPS-CALL-ARG1 001630 GO TO PROG-END 001640 END-IF. 001650 PROG-END. 001660 * 001670 ************************************************** 001680 * RPC-CLOSE(RPC環境の解除) * 001690 ************************************************** 001700 MOVE 'CLOSE ' TO DCRPS-CLOSE-REQUEST IN DCRPS-CLOSE-ARG1. 001710 MOVE ZERO TO DCRPS-CLOSE-FLAGS IN DCRPS-CLOSE-ARG1. 001720 MOVE DCCLS-CLTIN-CLTID IN DCCLS-CLTIN-ARG TO 001730 DCRPS-CLOSE-CLTID IN DCRPS-CLOSE-ARG1. 001740 * 001750 * ******************************* 001760 CALL 'CBLDCRPS' USING DCRPS-CLOSE-ARG1 DCRPS-CLOSE-ARG2 001770 DCRPS-CLOSE-ARG3. 001780 * ******************************* 001790 PROG-EXIT. 001800 MOVE 'CLTOUT ' TO DCCLS-CLTOUT-REQUEST IN DCCLS-CLTOUT-ARG. 001810 MOVE ZERO TO DCCLS-CLTOUT-FLAGS IN DCCLS-CLTOUT-ARG. 001820 MOVE DCCLS-CLTIN-CLTID IN DCCLS-CLTIN-ARG TO 001830 DCCLS-CLTOUT-CLTID IN DCCLS-CLTOUT-ARG. 001840 * 001850 * ******************************* 001860 CALL 'CBLDCCLS' USING DCCLS-CLTOUT-ARG. 001870 * ******************************* 001880 STOP RUN. 001890 *