• 検索結果がありません。

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. */

...

} ...

}