bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

Usignal(3c)

名前

Usignal()−BEA Tuxedo ATMI システム環境でのシグナル処理

形式

#include “Usignal.h” 

UDEFERSIGS()
UENSURESIGS()
UGDEFERLEVEL()
URESUMESIGS()
USDEFERLEVEL(level)

int (*Usignal(sig,func)()
int sig;
int (*func)();

void Usiginit()

機能説明

BEA Tuxedo ATMI システム・ソフトウェアが提供する多くの機能は、共有メモリ内のデータ構造に並行アクセスする必要があります。共有データ構造にアクセスするプログラムはユーザ・モードで走るため、シグナルを使用して中断することができます。共有データ構造の一貫性を維持するためには、それらの構造にアクセスする類の操作が、UNIX システムのシグナルを受け取っても中断されないことが重要です。ここで説明する関数は、ほとんどの一般的なシグナルに対する保護機構を提供するもので、BEA Tuxedo ATMI システムのコードの多くがその内部で使用します。また、これらの関数は、アプリケーション側で使用して、不用意にシグナルを受け取らないようにします。

この BEA Tuxedo ATMI システムのシグナル処理パッケージは、重要なコード部ではシグナルの発行を遅らせる、という発想から生まれたものです。このため、シグナルは、それが受信されてもすぐには処理されません。BEA Tuxedo ATMI システムのルーチンはまず最初に送信されたシグナルを捕捉します。そのシグナルを処理しても安全であれば、そのシグナルに指定された処理が実行されます。シグナルが安全でないということが判明した場合には、そのシグナルの到着が通知されるだけで、重要なコード部が終了したことをユーザが示すまでは、そのシグナルの処理は行われません。

マルチスレッド・プログラムでシグナルを使用することは可能ですが、使用しないことをお勧めします。ただし、シグナルを使用した場合には、マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても Usignal() の呼び出しを発行できます。

シグナルの捕捉

rmopen() または tpinit() を使用するユーザ・コードは、Usignal() 関数を使用してシグナルを捕捉するようにします。Usignal() は UNIX の signal() システム・コールのように機能しますが、例外として Usignal() では最初に、内部ルーチンがシグナルを捕捉してから、ユーザ・ルーチンをディスパッチするように調整します。

シグナルの遅延とリストア

ここで説明する呼び出しは、アプリケーション・コードでシグナルを後回しにする必要がある場合にのみ使用します。一般に、これらのルーチンは、不適切な場面でシグナルが到着しないようにするために BEA Tuxedo ATMI システムのルーチンが自動的に呼び出します。

シグナルを遅延またはリストアする前に、メカニズムを初期化する必要があります。初期化は、BEA Tuxedo ATMI システム・クライアントが tpinit() を呼び出したときに、BEA Tuxedo ATMI システムのクライアントとサーバのために自動的に行われます。また、初期化は、アプリケーションがはじめに Usignal() 呼び出すときに行われます。初期化は、Usiginit() を呼び出すことで明示的に行うことができます。

UDEFERSIGS() マクロは、重要なコード部分に入るときに使用してください。UDEFERSIGS() が呼び出された後、シグナルは保留状態になります。また、URESUMESIGS() マクロは、その重要な部分が終わる時点で呼び出すようにします。シグナル遅延スタックに注意してください。このスタックは、最初にゼロに設定されるカウンタを通して実現されます。UDEFERSIGS() への呼び出しによってシグナルが遅延されると、カウンタの値が 1 大きくなります。URESUMESIGS() の呼び出しによりシグナルが再開されると、カウンタの値は 1 小さくなります。カウンタがゼロ以外の値のときにシグナルが到着すると、そのシグナルの処理は後回しになります。シグナルが到着したときにカウンタがゼロであれば、そのシグナルはただちに処理されます。シグナルの再開により、カウンタがゼロになると (すなわち、再開の前のカウンタ値が 1 のとき)、その据置期間に到着したシグナルが処理されます。一般に、UDEFERSIGS() の呼び出しは、URESUMESIGS() の呼び出しと対で使用するようにします。

UDEFERSIGS 遅延カウンタの値を増分しますが、返す値はその増分前の値です。マクロ UENSURESIGS() は、遅延カウンタを明示的にゼロに設定する (そして、据え置かれたシグナルを強制的に処理させる) ときに使用できます。この場合、ユーザは UDEFERSIGS()URESUMESIGS() の不一致が生じないようにする必要があります。

関数 UGDEFERLEVEL() は遅延カウンタの現在の設定値を返します。マクロ USDEFERLEVEL(level) を使用すると、特定の遅延レベルを設定することができます。UGDEFERLEVEL()USDEFERLEVEL() は、setjmp/longjmp の状況で適切にカウンタを設定するときに便利です。この場合、遅延/再開の組み合わせは迂回されます。つまり、setjmp() が呼び出されたときに、UGDEFERLEVEl() の呼び出しによってカウンタの値を保存し、longjmp() が実行されたときに USDEFERLEVEL() の呼び出しによりカウンタ値をリストアする、という考え方です。

注意事項

Usignal は、SIGHUPSIGINTSIGQUITSIGALRMSIGTERM SIGUSR1、および SIGUSR2 の各シグナルについて遅延処理を行います。その他すべてのシグナル番号に対する処理要求は、Usignal() により直接 signal() 関数に渡されます。シグナルは非常に長い期間その処理が据え置かれることがあります。このため、シグナル遅延の間、シグナルの到着がすべてカウントされます。何回も到着する可能性のあるシグナルの処理が安全な場合、そのシグナルの処理ルーチンが繰り返し呼び出され、シグナルが到着した各シグナルが処理されます。各呼び出しの前には、シグナルのデフォルトの処理がなされます。つまり、安全なコードで連続して処理が行われる場合と同様に、据え置かれたシグナルが処理されるようにする、という考え方です。

一般に、ユーザは signal()Usignal() の呼び出しを同じシグナルに対して組み合わせて使用するべきではありません。できれば、Usignal() を使用する方法をとることが推奨されます。これによって、常にシグナルの状態を知ることができるからです。Usignal は、アプリケーションが BEA Tuxedo ATMI システム・サービスでアラームを使用したい場合などには必要です。こうすることにより、Usiginit() は、シグナルの遅延メカニズムを初期化するために呼び出されなければなりません。次に、signal() を呼び出し、意図するシグナル用に、メカニズムを変更します。シグナルの遅延メカニズムをリストアするために、Usignal()SIG_IGN で呼び出してから、再び、意図するシグナル処理関数で呼び出す必要があります。

シェル変数 UIMMEDSIGS を使用すれば、シグナルの据置を変更することができます。この変数の値が次のように英字 y で始まる場合、

UIMMEDSIGS=y

シグナルは Usignal() コードでインタセプトされません (したがって、据え置かれません)。このような場合、Usignal() の呼び出しはただちに signal() に渡されます。

また、Usignal は DOS オペレーティング・システムの配下では役に立ちません。

ファイル

Usignal.h

関連項目

UNIX システムのリファレンス・マニュアルの signal(2)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy