$ZINTerrupt

$ ZINT[ERRUPT] は、割り込み(たとえば、MUPIP INTRPT経由)が処理されるときにXECUTEされるコードを指定します。$ZINTERRUPTのアクションがプロセスの中にある間、追加の割り込みシグナルは破棄されます。割り込みハンドラが呼び出される時、現在の$REFERENCEの値が保存され、割り込みハンドラが復帰する時に復元されます。現在のデバイス($IO)は、どちらも保存されず、復元されます。

GT.Mは、$ZINTERRUPTの値を変更するためのSETコマンドを許可します。

もし割り込みハンドラが現在のIOデバイスを(USEによって)変更する場合、それはリターンする前に、現在のIOデバイスを復元する割り込みハンドラの責務です。プロセスコンテキストのこの部分は自動的に保存および復元されていないことを、割り込みルーチンは現在のIOデバイス(例えば;日次ログの切り替え)を変更したい理由に十分な正当な可能性があります。

もしそれが指定されている場合、$ZINTERRUPTの初期値は、UNIX環境変数 gtm_zinterruptから取得され、それ以外の場合は、以下の文字列にデフォルトを与えます。

IF $ZJOBEXAM()

IF文は、$ZJOBEXAM 関数を実行しますが、効果的に戻り値を破棄します。

[注意] 注意

もし$ZINTERRUPTのデフォルトの値が変更されている場合は、置換値が直接または間接的にその関数を呼び出す限りは、$ZJOBEXAM() は何も発生しません。言い換えると、$ZJOBEXAM() はデフォルトでは割り込み処理の一部である間は、それは割り込み処理の暗黙の一部ではありません。

割り込み処理

GT.Mプロセスの実行は、次のイベントで中断されます:

  • CTRL + CまたはSIGINT(CENABLEの場合)を入力( $PRINCIPAL がターミナルでない場合、GT.M は SIGINT(CTRL + C)を無視します)

  • CTRAP 文字の1つを入力

  • トランザクションで $ZMAXTPTIMEを超える

  • MUPIP INTRPTを取得(SIGUSR1)

  • +$ZTEXit は、最も外側のTCOMMITまたはTROLLBACKで真理値を評価

GT.Mは、これらのイベントのいずれかを検出すると、そのイベントに依存するベクトルに制御を移します。CTRAP文字とZMAXTPTIMEの場合、GT.Mは、エラー処理の章で詳しく説明されている $ETRAP または $ZTRAPベクトルを使用します。INTRPT と $ZTEXit では、$ZINTERRUPT に置かれた割込みハンドラのコードをXECUTEします。$ZINTERRUPT が空文字列の場合、MUPIP INTRPT に応答して何も行われません。$ZINTERRUPT のデフォルト値は、"IF $ZJOBEXAM()"です、それは ZSHOW "*" のダンプをファイルにリダイレクトし、そのような各機会をオペレータ・ログに報告します 。CENABLE を使用したCTRL + Cでは、ダイレクト・モードに入ってプログラマの制御を行います。

GT.Mは、これらのイベントが発生したときに多くのイベントを認識しますが、FOR LOOP の各繰り返しで、コマンドの実行中に「長い」時間がかかる可能性がある各M言語行の開始時に割り込みベクタに制御を移します。たとえば、ZWRITE、HANG、LOCK、MERGE、ZSHOW "V"、ディスク・ファイルとFIFOのOPEN、CONNECTパラメータ付きのSOCKETのOPENオープン(ゼロタイムアウトなし)、SOCKETのWRITE /WAIT、ターミナル,SOCKET,FIFOのREAD 、およびPIPE。+$ZTEXIT が最も外側のTCOMMITまたはTROLLBACKで真理値に評価されると、コミットまたはロールバックを完了した後に、GT.Mは $ZINTERRUPT を XECUTE します。CTRAP文字は、OpenVMSで入力されたときに認識されますが、UNIXで読み取られるときに認識されます。

GT.Mは、長時間実行されている外部呼び出し(たとえば、メッセージキューで待機中)で割り込みイベントが発生した場合、そのイベントを認識しますが、次の適切な実行境界に到達したときに外部呼び出しが戻った後にベクトルを転送します。

割り込みハンドラが呼び出されると、GT.Mは $REFERENCE の現在の値を保存して復元します。ただし、現在のデバイス($ IO)は保存も復元もされません。割り込みハンドラが(USEを介して)$IO を変更した場合、割り込みハンドラが現在のデバイスを復元してから復帰することを確認してください。割り込みハンドラの開始時に現在のデバイスを復元するには、デバイスパラメータなしでUSEを指定します。割り込みが認識されたときに IO を積極的に実行していたデバイス上で IO を実行しようとすると、ZINTERCURSEIOエラーが発生する可能性があります。

例:

set $zinterrupt="do ^interrupthandler($io)"
interrupthandler(currentdev)
       do ^handleinterrupt ; handle the interrupt
       use currentdev      ; restore the device which was current when the interrupt was recognized
       quit

INTRPT 機能を使用すると、割り込みハンドラ・コードの実行中に一時的なハングまたはポーズが発生することがあります。割り込みハンドラが IF $ZJOBEXAM() を使用してダンプを作成するデフォルトのケースでは、一時停止の継続時間は、ダンプの時点のプロセス内のローカル変数の数と書き込まれるディスクの速度に依存します。ダンプは、ローカルシステムに直接接続されているディスク上よりも、ネットワークにマウントされたディスク上の方が遅いです。任意の割り込み駆動型のコードは、この問題を考慮して設計する必要があります。

[重要] 重要

割り込みシグナルの送信では適切なアクセス権を持つ送信ユーザが必要なので、ジョブの割り込み機能の使用自体は、固有のセキュリティの突然の危機(危急)状態は存在しません。それにもかかわらず、デフォルトのアクションで作成されたダンプ・ファイルは、それが作られた時点にコンテキスト内のすべてのローカル変数の値を含むので、ダンプ・ファイルへの不適切なアクセスは、セキュリティの突然の危機(危急)状態の脅威になります。任意の割り込みロジックの設計と実装は、セキュリティ問題に慎重に検討されていることを確認してください。

割込み処理コードの実行中、$ZINITERRUPT は1(TRUE)と評価されます。

$ZINTERRUPT コードのコンパイル中にエラーが発生した場合、エラー・ハンドラは呼び出されず( $ZINTERRUPT コードの実行中にエラーが発生した場合にエラー・ハンドラが呼び出されます)、GT.M は、GTM-ERRWZINTRメッセージとコンパイラ・エラー・メッセージをオペレータログ機能へ送信します。GT.Mプロセスがダイレクト・モード・プロンプトになっている場合や、ダイレクト・モード・コマンド(FORループなど)を実行している場合、GT.Mは、GTM-ERRWZINTRエラーメッセージをコンパイルエラーと共にユーザコンソールに送信します。どちらの場合も、中断されたプロセスは、$ZINTERRUPT の不完全なベクトルによって指定されたアクションを実行せずに実行を再開します。

GT.Mが割り込みハンドラのスタック・フレームの作成中にエラーを検出すると(ベクタで指定されたアプリケーション・コードに制御を移す前に)、そのエラーの先頭にGTM-ERRWZINTRエラーが付きます。エラー・ハンドラは、中断されたルーチンに関連する通常のエラー処理を実行します。割り込みベクタによって呼び出されたコードで発生するその他のエラーは、 第13章: “エラー処理で説明したエラー処理を呼び出します。

[注意] 注意

割り込みハンドラは、現在のMの環境の"外で:outside" での動作なしなくで、むしろプロセスの環境の中で動作します。

TPのトランザクションが進行中(0<$TLEVEL)の場合は、割り込みハンドラが戻った後でさえも、TPの再起動はコミットされるトランザクションより以前はいつでも信号を送ることができるので、グローバルへのアップデートは安全ではありません。TP再起動は、すべてのグローバル更新を逆さにして、割り込みが発生しなかった場合と同様であるので、Mのスタックを巻き戻します。割り込みハンドラは、トランザクションの再起動の一部として再ドライブされません。割り込みハンドラ内での参照(読み取り)グローバルは、トランザクションがアクティブな場合、TP再起動をトリガできます。割り込み処理をプログラミングする場合、0<$TLEVELの時(中断している集合を再びやり直すことを強制する)に割り込みを破棄するか、または、最終TCOMMITの後まで割り込みアクションを延期するTRESTARTによって復元されていないローカル変数を使用するか、のどちらかです。

inserted by FC2 system