Server Express 技術情報(FAQ)


COBOL アプリケーションのエラーを OS やミドルウェアのシグナル処理へ連携することはできますか

Server ExpressのCOBOLアプリケーションのプロセスがシグナルを発生すると、デフォルトでは COBOLランタイムシステムがシグナルを検知し、独自のエラー処理を行います。例えば、COBOLから CALLされた Cサブルーチンの中でポインタ操作を誤って、セグメンテーションフォールトを起こした場合、COBOLのランタイムエラー 114 となります。

場合によっては、このように COBOLランタイムシステムにシグナル処理をさせることなく、OSやミドルウェアにシグナル処理を任せる必要が生じます。例えば、トランザクションモニターのミドルウェア配下でCOBOLのプロセスを稼動させる場合、アプリケーションのエラーはトランザクションモニターに処理させなければなりません。また、COBOLアプリケーションが自分でシグナルハンドラを登録して、独自に処理をさせる場合もありえます。

このような場合のために Server Expressは、ランタイムシステムのデフォルトのシグナル処理を構成する方法を用意しています。以下にその方法を説明します:

このための環境設定は、実行時構成ファイル $COBDIR/etc/cobconfig 中に記述します。環境変数 COBCONFIG を設定して、この構成ファイルの名前を指定することができます。次に例を示します。

COBCONFIG=$HOME/myconfig
export COBCONFIG

実行時構成ファイルには、一連の実行時構成可能変数とその値を記述します。シグナル処理に関しては、以下の変数 signal_regime を使用します。

signal_regime

構文

set signal_regime(sig)=integer
または
set signal_regime=1

integer

ランタイムシステムがシグナル、 sig を受け取るアクションを選択します。sig に指定する値は、1 から、ご利用のオペレーティングシステムのシグナル番号の最大値までのいずれかの値にする必要があります。シグナル番号に関する詳細は、ご利用のオペレーティングシステムのマニュアルを参照してください。この調整可能変数を使用する必要があるのは、シグナルを使用するサードパーティのソフトウェアで Server Express を使用する場合のみです。
integer には次の値が指定できます。

0 : 
必要な場合に、シグナル、 sig がランタイムシステムで使用されます。デフォルトでは、ランタイムシステムは、オペレーティングシステムのデフォルトのアクションを終了させるようなシグナルすべてに対し、シグナルハンドラを設定します。ランタイムシステムは、終了する前にこれらのシグナルを受け取って対処します (たとえば、ファイルが破損されないように、開いているファイルを閉じるなど)。 

1 :
シグナル sig は、まだハンドラにポストされていない場合のみ、ランタイムシステムで使用されます。 これは、Server Express の前にサードパーティのソフトウェアが起動された場合に有効で、サードパーティのソフトウェアによって、シグナル、 sig に対するハンドラが設定されます。この調整可能変数がこのシグナルに対して設定されていない場合は、サードパーティのソフトウエアのハンドラが、ランタイムシステムのハンドラで上書きされます。この場合は、予期しない動作が発生し、ランタイムシステムエラー 115 (「予測しない信号を検出した」) などが生成されます。ハンドラがポストされると、そのシグナルに対するハンドラは、ランタイムシステムでポストされません。そのため、このシグナルに関するランタイムシステムの機能も動作しません。 

2 :
シグナル sig はランタイムシステムで使用されません。これは、Server Express の後にサードパーティのソフトウェアが起動された場合にのみ有効で、サードパーティのソフトウェアによって、シグナル、 sig に対するハンドラが設定されます。 この値を設定すると、オペレーティングシステムのデフォルトのアクションを終了させるようなシグナルがかなり妨害されます。つまり、呼び出されたランタイムシステムと、このシグナルのハンドラを設定しているサードパーティのソフトウェア間でこのようなシグナルが受信されると、オペレーティングシステムのデフォルトのアクションが実行され、プロセスは、ランタイムシステムで対処できないまま、終了します。これにより、ファイルが破損するなどの障害が発生することがあります。このシグナルに関するランタイムシステムの機能はどれも動作しません。 

デフォルト値

すべてのシグナルに対して 0 が設定されています。

コメント

別の構文 (set signal_regime=1) を使用した場合は、すべてのシグナルに対するシグナル方式は 1 に設定されます。この場合、この構文で設定できる値は 1 のみであることに注意してください