【PL/I学習|豆知識】メインフレームにおける「中断」の作法:ON ATTENTIONによる安全な終了処理

導入

メインフレームのオンライン環境(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」まで到達させる設計を心がけてください。

これらを意識するだけで、システム運用における事故を未然に防ぐことができます。ぜひ、既存のプログラムの保守時に取り入れてみてください。

コメント

タイトルとURLをコピーしました