1.1.2 コーディング規約
(1) コーディング上の注意
OpenTP1で使うUAPをCOBOL言語でコーディングするときは,COBOL85またはCOBOL2002の様式に従ってください。OpenTP1の機能を使うときは,OpenTP1のライブラリにあるCOBOL-UAP作成用プログラムを使います。
さらに,システムコールや任意のプログラムのライブラリも使えますが,コーディング時には,UAPの移植性を高めるため,OSで標準的に提供している命令文やシステムコールを使うことをお勧めします。
システムコールや任意のプログラムのライブラリを使うUAPをCOBOL言語で作成するときは,次のことに注意してください。
-
UAPでシグナルを使うときは,SIGILLやSIGBUSなどシグナルのデフォルト動作がコアファイルを作成するタイプのシグナルハンドラは登録しないでください。これらのシグナルハンドラを登録すると,プログラムが異常終了してもコアファイルが作成されないため,トラブルシュートができない場合があります。
-
UAPでシグナルを使うときは,シグナルハンドラからはOpenTP1のライブラリにある関数に該当するCOBOL-UAP作成用プログラムは使わないでください。
-
次のシステムコールは使わないでください。
-
chdir(カレントワーキングディレクトリを変更)
-
-
CBLDCRPC('OPEN ')を呼び出したあとには,次のシステムコールは使わないでください。
-
fork(新プロセスの生成)
-
exec(ファイルの実行)
-
system(シェルコマンドの発行)
-
-
サービスプログラム間にわたるジャンプ(GOTO文など)は使わないでください。
-
ほかのプログラムのライブラリを使うときは,XlibやOSF/Motifなど,イベント駆動型のディスパッチング制御をするプログラムは使えません。
-
COBOL言語でUAPを作成する場合,一意名1などのデータ領域は,必ず偶数番地から始まるように設定してください。一意名1などのデータ領域の先頭アドレスが奇数番地だとバスエラーが発生します。
例えば,CBLDCMCFで使用する一意名3を配列で定義し,送信データが奇数バイトで,かつ構造体に"SYNC"の指定がない(境界調整されていない)場合,配列の2件目のデータをCBLDCMCFの引数に設定すると,関数処理中にバスエラーが発生します。
-
COBOL言語で作成したC系およびV系MCFイベント用MHPで受け取るMCFイベント情報領域には,C言語用のMCFイベント情報の予備領域長に加えて2以上の予備領域を設定してください。
-
データ部(DATA DIVISION)の2進形式のデータ項目にPICTURE句で指定したけた数を超える値を指定する場合(CBLDCRTS('RTSPUT ')の一意名2にデータ名C PIC S9(9) COMP VALUE2147483647を指定するなど),コンパイル時にエラーが発生します。この場合,次のどちらかで対処してください。
-
データ部(DATA DIVISION)では値を指定しないで,手続き部(PROCEDURE DIVISION)でMOVE文などによって値を指定するようにコーディングする。
-
2進形式のデータ項目に指定できる初期値を拡張するコンパイルオプション(COBOL85の場合:-Vx,COBOL2002の場合:-BinExtend)を指定して,コンパイルする。
-
-
CBLDCRPC('OPEN ')を呼び出したあとには,UAPプロセスでオープンするファイルディスクリプタの最大数を変更しないでください。変更した場合の動作は保証できません。
-
OpenTP1のCOBOL言語用のAPIでは,リターン時にRETURN-CODE特殊レジスタは設定していません。COBOL言語の仕様により値は不定となります。OpenTP1のCOBOL言語用のAPIで,実行結果の判断はステータスコードを参照してください。
OSがHP-UXの場合,リンケージ時のバインドモードには必ず "immediate"を指定してください。"immediate"以外のバインドモードで作成した実行形式ファイルをOpenTP1のUAPとして使った場合,システムの動作は保証しません。作成したUAPのバインドモードが"immediate"かどうかは,OSのchatrコマンドで確認してください。