10.3定義されているDD文の取得(TIOTの探索)
JCLにどのようなDD文が定義されているかを知りたい場合は、TIOTをスキャンします。TIOT(Task Input/Output Table)は、JCLに定義されたDD文に基づいて作成される制御表で、ステップ開始時のデバイス・アロケーション処理の過程で作成されます。TIOTはジョブ名やステップ名が格納されているヘッダー部分の後に、定義されたDD文に対応したDDエントリーが続きます。DDエントリーにはDD名、JFCBへのポインタートークン、関連デバイスのUCBアドレス、制御用のフラグ・フィールドなどが格納されています。
JCLに定義されているDD文のリストを作る(TIOTを直接たどる)
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SYSPRINT,OUTPUT) OPEN LIST DATASET SPACE , EXTRACT DOUBLE,'S',FIELDS=TIOT ISSUE EXTRACT SVC L R2,DOUBLE LOAD OUR TIOT ADDRESS LA R3,TIOENTRY-TIOT1(,R2) LOCATE TO DD-ENTRY USING TIOENTRY,R3 ADDRESS IT SLR RA,RA CLEAR WORKREG LOOP DS 0H IC RA,TIOELNGH LOAD THIS ENTRY LENGTH LTR RA,RA LAST ENTRY ? BZ DONE YES, PROCESSING DONE MVC LISTREC+7(8),TIOEDDNM SET DDNAME PUT SYSPRINT,LISTREC PRINT IT LA R3,TIOENTRY(RA) LOCATE TO NEXT ENTRY B LOOP TRY TO NEXT ENTRY SPACE , DONE DS 0H CLOSE (SYSPRINT) CLOSE LIST DATASET SLR RF,RF SET CC=0 SVC 3 EXIT TO DISPATCHER : : DOUBLE DC D'0' DOUBLE WORD WORKAREA LISTREC DC CL80'DDNAME=XXXXXXXX' SYSPRINT DCB DDNAME=SYSPRINT, LIST DATASET DCB + MACRF=PM,DSORG=PS, + RECFM=FB,LRECL=80 : : DTIOT DSECT , IEFTIOT1 , TIOT
TIOTのアドレスを得たら、先頭のDDエントリーに位置付けます。DDエントリーの先頭にはそのエントリーの長さが入っているので、それを元に順次たどって行くことができます。DD名だけでなく、DD文に定義されたパラメーター情報を得るためにJFCBを求めることもできますが、JES2のJOBCLASS定義によってJFCBが拡張SWA領域に置かれていると、TIOTにはJFCBアドレスではなくSWAREQマクロで使用するトークン値が入り、JFCBを求めるにはSWAREQマクロを使用しなければなりません。JFCBを得るなら代わりにRDJFCBマクロを発行してもかまいません。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- L R2,PSATOLD-PSA LOAD OUR TCB ADDRESS L R2,TCBTIO-TCB(,R2) LOAD OUR TIOT ADDRESS ******** EXTRACT DOUBLE,'S',FIELDS=TIOT ISSUE EXTRACT SVC ******** L R2,DOUBLE LOAD OUR TIOT ADDRESS LA R3,TIOENTRY-TIOT1(,R2) LOCATE TO DD-ENTRY USING TIOENTRY,R3 ADDRESS IT : : DTIOT DSECT , IEFTIOT1 , TIOT IHAPSA , PSA IKJTCB , TCB
EXTRACTマクロの代わりに、TCBから直接TIOTをたどっても同じことができます。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- L R2,PSATOLD-PSA LOAD OUR TCB ADDRESS L R2,TCBTIO-TCB(,R2) LOAD OUR TIOT ADDRESS N R2,=A(X'00FFFFFF') CLEAR HI-ORDER BYTE GETTIOT (2) LOAD ACTUAL TIOT ADDRESS LA R3,TIOENTRY-TIOT1(,R1) LOCATE TO DD-ENTRY USING TIOENTRY,R3 ADDRESS IT : :
MSPはMVSと同じ方法でTIOTを求められますが、VOS3の場合はTCBあるいはEXTRACTで求めたTIOT(ヘッダ)アドレスからDDエントリーを求める場合、GETTIOTマクロを使います。このマクロを使えばTIOTのDDエントリー部が16MB以上の領域に展開されている場合でも正しい探索が可能になります。
JCLに定義されているDD文のリストを作る(DSABからTIOTを求める)
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SYSPRINT,OUTPUT) OPEN LIST DATASET SPACE , GETDSAB FIRST, GET 1ST OUR DSAB + DSABPTR=DSABPTR,LOC=ANY L R2,DSABPTR LOAD DSAB ADDRESS USING DSAB,R2 ADDRESS IT LOOP2 DS 0H L R3,DSABTIOT LOAD ASSOCIATED TIOT DD-ENTRY USING TIOENTRY,R3 ADDRESS IT MVC LISTREC+7(8),TIOEDDNM SET DDNAME PUT SYSPRINT,LISTREC PRINT IT ICM R2,B'1111',DSABFCHN LOAD NEXT DSAB ADDRESS BNZ LOOP2 IF NEXT DSAB EXIST SPACE , DONE DS 0H CLOSE (SYSPRINT) CLOSE LIST DATASET SLR RF,RF SET CC=0 SVC 3 EXIT TO DISPATCHER : : DOUBLE DC D'0' DOUBLE WORD WORKAREA DSABPTR DC A(0) DSAB POINTER LISTREC DC CL80'DDNAME=XXXXXXXX' SYSPRINT DCB DDNAME=SYSPRINT, LIST DATASET DCB + MACRF=PM,DSORG=PS, + RECFM=FB,LRECL=80 : : DTIOT DSECT , IEFTIOT1 , TIOT CVT DSECT=YES CVT IEFJESCT , JESCT IHADSAB DSAB
MVSにおいて、TIOTが16MBより上のSWA領域に作られているXTIOTの場合は、従来のTIOT探索では求めることができません。JCLに定義されたDD文に関しては16MB未満の領域に作られますが、動的割り振りによって割り振られたデータセットやデバイスにおいてXTIOT要求の指定があると、その割り当てに関するDDエントリーは16MBより上の領域に作成され、16MBより下の領域にあるTIOTとは切り離されて管理されます。プログラム内でXTIOTを使用するダイナミック・アロケーションを行っていない限り、XTIOTを意識する必要はありませんが、もしXTIOTも含めてDDエントリーをたどる場合は、DSAB(Data Set Association Block)のチェインをたどり、DSABから対応するTIOTを求める方法があります。
XTIOTはDB2など、一部のシステムプロダクトで使用されています。
2 Responses to “10.3定義されているDD文の取得(TIOTの探索)”
Comment from アルテシード
Time 2011年6月16日 at 11:50
ただTIOTでもXTIOTでもフィールド内容を書き換えれば更新はされると思います。書き込み自体が無効になっているのか、何らかの誤りで全然違うところを更新しているのか、何かのタイミングで書き戻されてしまうのか、正しく更新しているのに反映されないってことでしょうか。XTIOTにはシャドウがあるとも思えませんし。
いずれにしても当方は解決に有用な情報を持っておりません。お役に立ちませんで...
Comment from 角野 修
Time 2011年6月15日 at 17:41
質問:ダイナミックにDD名を変更する手法としてTIOTのDDエントリーよりサーチしたDD名を変更しています。Z/OS V1.6までは何の問題も無く正常に稼動していたのですがZ/OS V1.10から変更したDD名が認識されないようになりました。
ちなみに、認識されないものはVSAMのDD名のみです。PSのデータセットは問題なくDD名の変更ができています。
(変更時はMODESETでMODE=SUPにしています)
今まではVSAMのDD名もTIOTのDDエントリーのDD名を変更し稼動できていたのですがZ/OS V1.10から稼動できなくなった理由が分かりません。
稼動させているプログラムはIFASMFDP でSMFのDUMPを行なわせる為にこのPGMをLINKしてDUMPINのDD名をTIOTにセットして呼び出しています。
この関連の情報でご存知のことがありましたら教えていただきたく、よろしくお願いします。