導入:なぜDCBを直接覗く必要があるのか
メインフレームでのシステム開発において、通常はPL/IのINQUIRE命令などを使用してファイルの状態を確認します。しかし、極めて高いパフォーマンスが求められるバッチ処理や、OSの内部挙動をリアルタイムで監視する必要がある特殊なツール開発においては、OSが管理する制御ブロックであるDCB(Data Control Block)を直接参照する手法が取られることがあります。ADDR(FILE)を活用したこのテクニックは、OSがファイルをどのように制御しているかを「生」のデータとして取得するための、熟練技術者向けの強力な武器となります。
基礎知識:DCBとは何か
DCB(データ制御ブロック)とは、OSがファイル(データセット)を処理するために必要な情報が格納されているメモリ上の領域です。ここには、レコードの長さ、バッファのアドレス、現在のファイルの状態(オープン中かどうかなど)といった情報が詰まっています。PL/IのADDR関数は、指定した変数や構造体のメモリ上のアドレスを返しますが、これをファイル変数に対して使用することで、そのファイルに関連付けられたDCBの先頭アドレスを特定することができます。
実装:ポインタとロケータによるアクセス
DCBを直接操作するには、PL/Iの「ポインタ」と、そのアドレスをマッピングするための「構造体(ベース付き変数)」を使用します。DCBのレイアウトはOSのバージョンや種類によって定義されているため、事前にシステムが定義するDSECT(ダミーセクション)に対応する構造体を定義する必要があります。
サンプルプログラム:DCB情報を取得するコード例
以下のコードは、ファイルのアドレスを取得し、デバッグや監視のためにDCBの一部を読み取る例です。
/ ファイルのDCBアドレスを取得して内容を覗くサンプル /
TEST_DCB: PROCEDURE OPTIONS(MAIN);
/ ファイル定数の定義 /
DCL MYFILE FILE RECORD INPUT;
/ DCBのメモリレイアウトを模した構造体定義(簡略版) /
DCL 1 DCB_MAPPING BASED(P_DCB),
2 DCB_ID CHAR(4), / DCBの識別子 /
2 DCB_RECFM BIT(8), / レコードフォーマット /
2 DCB_LRECL FIXED BIN(15); / 論理レコード長 /
/ ポインタ変数の定義 /
DCL P_DCB POINTER;
/ 1. ADDRを使ってファイル定数からDCBのアドレスを取得 /
P_DCB = ADDR(MYFILE);
/ 2. ポインタ経由でDCBの内容を参照(ハック的手法) /
PUT SKIP LIST(‘DCB ID: ‘ || DCB_ID);
PUT SKIP LIST(‘Logical Record Length: ‘ || DCB_LRECL);
END TEST_DCB;
応用・注意点:現場で役立つアドバイス
この手法を用いる際には、以下の点に十分注意してください。
1. OS依存性が極めて高い
DCBの構造はOSのバージョンアップやPTF(修正プログラム)の適用によって変更される可能性があります。このコードは「特定の環境下でしか動作しない可能性がある」という前提を持つべきです。
2. 読み取り専用で扱う
DCBの情報を取得することは可能ですが、値を直接書き換えることは極めて危険です。OSの整合性が保てなくなり、システム全体が異常終了(ABEND)する原因となります。情報の参照(READ)のみに留めてください。
3. モダンな環境への移行を見据える
もし将来的にJavaやクラウド環境への移行を検討している場合、DCBを直接叩くコードは「技術的負債」となり、移植が非常に困難です。可能な限り標準的なINQUIRE命令を使用し、どうしても必要な場合にのみ、このADDR(FILE)の手法を採用するようにしましょう。

コメント