導入
メインフレームのオンライン環境(TSOなど)で、ユーザーが誤って長い処理を走らせてしまったり、無限ループに陥ったりした際、皆さんはどう対処されていますか?「ATTN」や「PA1」キーを押して強制終了させるのは一般的ですが、そのままプログラムを落とすと、更新途中のデータが不整合を起こしたり、ファイルがクローズされず破損したりするリスクがあります。今回解説する「ON ATTENTION」は、そうした割り込みをプログラム側で検知し、安全に後始末を行うための重要なスキルです。
基礎知識
PL/I等のメインフレーム言語において、例外処理を行うための「ON-Unit」という仕組みがあります。「ON ATTENTION」は、その中でもユーザーによる割り込み操作(ATTNキーなど)をキャッチするための命令です。
現代のPC環境における「Ctrl+C」によるSIGINTシグナル受信に近い概念で、システムから「今すぐ中断せよ」という非同期の合図が来た際に、プログラムが即座に反応して「終了準備(クローズ処理やロールバック)」を行うためのインターフェースとなります。
実装/解決策
実装の基本は、プログラムの初期化フェーズで「割り込みが発生した際は、このルーチンを実行せよ」とON-Unitを宣言しておくことです。これにより、ユーザーが中断を要求した瞬間に、特定のサブルーチンへ制御が移ります。
重要なのは、割り込みが発生した場所がどこであれ、一貫した終了処理が実行されることです。これにより、中途半端な状態で処理が停止することを防ぎます。
サンプルプログラム
以下は、ファイル処理中に割り込みが発生した場合を想定したPL/Iのコード例です。
/ 割り込み発生時の終了処理ルーチン /
TERMINATE_CLEANLY: PROCEDURE;
PUT SKIP LIST('割り込みを検知しました。処理を安全に終了します。');
/ ファイルのクローズ処理やロールバックをここで実行 /
CLOSE FILE(MASTER_FILE);
PUT SKIP LIST('クローズ完了。システムを終了します。');
STOP;
END TERMINATE_CLEANLY;
/ メイン処理開始 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ 割り込み発生時の動作を定義 /
ON ATTENTION CALL TERMINATE_CLEANLY;
PUT SKIP LIST('重い処理を開始します...');
/ 意図的に長いループを実行 /
DO I = 1 TO 1000000;
/ ここで長時間処理が行われると仮定 /
END;
PUT SKIP LIST('処理が正常に終了しました。');
END MAIN_PROC;
応用・注意点
現場での運用において、特に注意すべき点は以下の2点です。
1. リソースの整合性: 割り込みハンドラ内では、複雑な処理を避けてください。あくまで「ファイルを閉じる」「フラグを立ててロールバックを促す」「ログを出力する」といった、最低限の安全確保に徹するのが定石です。
2. 再帰呼び出しの回避: 終了処理の中でさらにエラーが発生し、再びON-Unitが呼び出されると無限ループに陥る可能性があります。終了ルーチンはシンプルに保ち、確実に「STOP」まで到達させる設計を心がけてください。
これらを意識するだけで、システム運用における事故を未然に防ぐことができます。ぜひ、既存のプログラムの保守時に取り入れてみてください。

コメント