C モジュール作成 (CRTCMOD) または結合 C プログラム作成 (CRTBNDC) のコンパイル・オプションに、SYSIFCOPT(*ASYNCSIGNAL) オプションを指定した場合、非同期シグナル・モデル (ASM) が使用されます。 C++ モジュール作成 (CRTCPPMOD) または結合 C++ プログラム作成 (CRTBNDCPP) のコンパイル・コマンドに、RTBND(*LLP64) オプションを指定した場合にも、ASM が使用されます。 これは、UNIX® オペレーティング・システムからインポートされたアプリケーションとの互換性を確保するためのものです。 ASM を使用するモジュールの場合、signal() 関数と raise() 関数は、i5/OS® シグナル API (詳細は、i5/OS Information Center の見出し『プログラミング』の下にあるトピック『アプリケーション・プログラミング・インターフェース』を参照) を使用して、インプリメントされます。
ASM のモジュールまたはプログラムに送られた i5/OS 例外は、非同期シグナルに変換されます。 この例外は、非同期シグナル・ハンドラーによって処理されます。
ASM を使用するためにコンパイルされたモジュールは、同一のプロセス、プログラム、およびサービス・プログラム内でオリジナル・シグナル・モデル (OSM) を使用するモジュールと混合させることができます。 この 2 つのシグナル・モデル間には、以下のような違いがあります。
非同期シグナルは、例外にマップされません。 さらに、OSM 下に登録されているシグナル・ハンドラーによる処理も行われません。 ASM では、_C_async_exception_router 関数 (例外を非同期シグナルにマップします) によって、例外の受信および処理が行われます。 ASM シグナル・ハンドラーは、i5/OS 非同期シグナル・コンポーネントからコントロールを受け取ります。
OSM モジュールがシグナルを発すると、生成された例外が、例外モニターを見つけるまで呼び出しスタックをパーコレートします。 前の呼び出しが OSM 関数であった場合、_C_exception_router が例外をキャッチして、OSM シグナル・アクションを実行します。 ASM シグナル・ハンドラーは、シグナルを受信しません。
前の呼び出しが ASM 関数であった場合、_C_async_exception_router が例外を処理して、非同期シグナルにマップします。 その場合、非同期シグナルの処理は、トピック『i5/OS シグナル管理』に定義されているように、スレッドの非同期シグナルのベクトルおよびマスクの状態に応じて異なります。
前の呼び出しが別のプログラムまたはサービス・プログラム内にある ASM 関数であった場合、2 つのアクションのいずれかが発生します。 シグナルを発する OSM プログラムが、ASM プログラムと共に同一の活動化グループ内で実行されている場合、前述のマッピングを使用して、例外が非同期シグナルにマップされます。 例外がシグナルにマップされる場合も、シグナル ID は保持されます。 したがって、非同期シグナル・モデルで登録されたシグナル・ハンドラーでも、オリジナル・シグナル・モデル下で生成されたシグナルを受信できます。 このアプローチを使用して、2 つのプログラムをさまざまなシグナル・モデルと統合することができます。
シグナルを発する OSM プログラムが、ASM プログラムとは異なる活動化グループ内で実行されている場合、その活動化グループ内でモニターされないシグナルがあれば、そのシグナルによってプログラムおよび活動化グループが終了します。 その場合、モニターされないシグナルは、CEE9901 例外として呼び出し側プログラムへパーコレートされます。 CEE9901 例外は、SIGSEGV 非同期シグナルへマップされます。