Operating Systems
6 Oracle プリコンパイラおよび Oracle Call Interface の使用
6.12 シグナル・ハンドラの使用
Oracle Databaseでは、2タスク通信にいくつかのシグナルが使用されます。シグナルは、プロセス
がデータベースに接続するとユーザー・プロセスにインストールされ、切断すると削除されま す。
次の表では、Oracle Databaseで2タスク通信に使用されるシグナルについて説明します。
表6-4 2タスク通信に使用されるシグナル
シグナル 説明
SIGCLD Oracleプロセスが終了すると、パイプ・ドライバはSIGCLD(SIGCHLDともいいます)を
使用します。SIGCLDシグナルは、オペレーティング・システム・カーネルによってユ ーザー・プロセスに送信されます。シグナル・ハンドラは、wait()ルーチンを使用し て、サーバー・プロセスが異常終了しているかどうかを調べます。Oracleプロセスでは なく、ユーザー・プロセスがSIGCLDを受け取ります。
SIGCONT パイプ2タスク・ドライバが、バンド外ブレークをユーザー・プロセスからOracleプロ
セスに送信する場合に、SIGCONTを使用します。
SIGINT 2タスク・ドライバが、ユーザーの割込み要求を検出する場合に、SIGINTを使用しま
す。Oracleプロセスではなく、ユーザー・プロセスがSIGINTを受け取ります。
プロトコルが、ネットワーク・イベントの着信を示す場合に、 を使用 します。
SIGPIPE パイプ・ドライバが、通信チャネルのファイルの終わりを検出する場合に、SIGPIPEを
使用します。パイプへの書込み時に読取りプロセスが存在していない場合、SIGPIPEシ グナルが書込みプロセスに送信されます。Oracleプロセスとユーザー・プロセスの両方 が、SIGPIPEを受け取ります。SIGCLDは、SIGPIPEに似ていますが、ユーザー・プロ セスのみに適用され、Oracleプロセスには適用されません。
SIGTERM パイプ・ドライバが、ユーザー側からOracleプロセスに割込みシグナルを送る場合
に、SIGTERMを使用します。ユーザーが割込みキー([Ctrl]+[C])を押すと、このシグナ ルが送信されます。ユーザー・プロセスではなく、OracleプロセスがSIGTERMを受け 取ります。
SIGURG Oracle Net TCP/IPドライバが、バンド外ブレークをユーザー・プロセスからOracleプロ
セスに送信する場合に、SIGURGを使用します。
表に記載されているシグナルは、すべてのプリコンパイラ・アプリケーションに影響しま
す。Oracleプロセスへの接続時に、SIGCLD(またはSIGCHLD)およびSIGPIPEにシグナル・ハンド ラを1つのみインストールできます。osnsui()ルーチンをコールして設定すると、複数のシグナ ル・ハンドラをSIGINT用にインストールできます。SIGINTの場合は、osnsui()およ
びosncui()を使用して、シグナル受取りルーチンを登録および削除します。
また、必要に応じて、他のシグナルにもシグナル・ハンドラをインストールできます。 Oracleプ ロセスに接続していない場合は、複数のシグナル・ハンドラをインストールできます。
例6-1に、シグナル・ルーチンおよび受取りルーチンの設定方法を示します。
例6-1 シグナル・ルーチンおよび受取りルーチン
/* user side interrupt set */
word osnsui( /*_ word *handlp, void (*astp), char * ctx, _*/) /*
** osnsui: Operating System dependent Network Set User-side Interrupt. Add an
** interrupt handling procedure astp. Whenever a user interrupt(such as a ^C)
** occurs, call astp with argument ctx. Put in *handlp handle for this
** handler so that it may be cleared with osncui. Note that there may be many
** handlers; each should be cleared using osncui. An error code is returned if
** an error occurs.
*/
SIGIO Oracle Net SIGIO
/* user side interrupt clear */
word osncui( /*_ word handle _*/ );
/*
** osncui: Operating System dependent Clear User-side Interrupt.
Clear the
** specified handler. The argument is the handle obtained from osnsui. An error
** code is returned if an error occurs.
*/
例6-2に、アプリケーション・プログラムでのosnsui()およびosncui()ルーチンの使用方法を 示します。
例6-2 osnsui()およびosncui()ルーチンのテンプレート
/*
** User interrupt handler template.
*/void sig_handler() {
...
}
main(argc, argv) int arc;
char **argv;
{
int handle, err;
...
/* Set up the user interrupt handler */
if (err = osnsui(&handle, sig_handler, (char *) 0)) {
/* If the return value is nonzero, then an error has occurred
Take appropriate action for the error. */
...
}
...
/* Clear the interrupt handler */
if (err = osncui(handle)) {
/* If the return value is nonzero, then an error has occurred
Take appropriate action for the error. */
...
} ...
}