ライブラリからのジョブ起動
- 2.1 ジョブの起動
-
LM、JS、PMは、RUNコマンドで直接実行したり、(メニューに登録してあれば)メニューから選択実行したり、あるいは別のプログラム中から呼び出して実行したりできます。
RUNコマンドで実行する場合には、
AAA,DEV=MSD000,FIL=USERLML,TYP=LM;
のように装置名(DEV=)、ライブラリファイル名(FIL=)を指定する必要があります。
(今回は厳密にTYP=も記述しましたが省略可能で、普通は書かないことが多い。)
ちなみにパラメータの順番はありません。「AAA,FIL=USERLML,DEV=MSD000,TYP=LM;」でも「AAA,DEV=MSD000,TYP=LM,FIL=USERLML;」でも全くかまいません。
上の例では、『装置番号「MSD000」にあるライブラリファイル「USERLML」に入っているロードモジュール「AAA」を実行せよ!』とコンピュータに指示しています。
Windowsと比較すると、例えばメモ帳を「ファイル名を指定して実行(R)」から実行する場合
c:\windows\notepad.exe
と書きます。
上の例では、『ドライブ「C」にあるフォルダ「\windows」に入っているexeファイル「notepad.exe」を実行せよ!』とコンピュータに指示している訳です。
-----------------------
ところでシステムフォルダにあるnotepad.exeは、ドライブ名やフォルダをいちいち書かなくても、下のように記述すれば実行することができます。
notepad.exe
A−VXも同じようにSRV(MSD000)にある3つのシステムライブラリ(SYS@LML、SYS@JSL、SYS@PML)は、装置名やファイル名を書かなくても実行できます。
例えばSYS@LMLには、ユーティリティの#ABCが入っています。このユーティリティを実行する場合、「#ABC,DEV=MSD000,FIL=SYS@LML;」と書いても実行できますが、普通は、
#ABC;
と書いて実行します。
ユーティリティ以外でも同じで、AAAというLMをSRVのSYS@LMLに入れれば、
AAA;
というようにDEV=もFIL=も省略することができます。
- 2.2 ジョブ起動ファイルの自動サーチ
-
さて、AAAという名前のメンバがSYS@LMLとSYS@JSLに入っているとしましょう。RUNコマンドで「AAA;」として実行したら、SYS@LML内のLM「AAA」とSYS@JSL内のJS「AAA」のどちらが実行されるでしょうか。
正解はSYS@LMLの「AAA」が実行される、です。
これは以下のような決まりで実行するメンバを決めているからです。
No. DEV指定 FIL指定 動 作 1 ○ ○ 指定された装置の指定されたファイル内だけを探す。 2 ○ × 指定された装置上のSYS@LML->SYS@JSL->SYS@PMLの順に指定のジョブを探す。 3 × ○ SRV上の指定されたファイル内だけを探す。 4 × × RUNコマンド及びスレッドの最初のJSまたはPMの/RUNステートメントの場合、SRV上のSYS@LML->SYS@JSL->SYS@PMLの順に指定のジョブを探す。
スレッドの途中でのJSまたはPMの/RUNステートメントあるいはプログラム内の内部コール命令の場合、このスレッドのプライベートロードモジュールライブラリ->SRVのSYS@LML->SYS@JSL->SYS@PMLの順に指定のジョブを探す。
プライベートロードモジュールライブラリが保持されていなければ、SYS@LML->SYS@JSL->SYS@PMLの順に指定のジョブを探す。
Windowsでは「バッチファイル」->「comファイル」->「exeファイル」の順番でサーチされます。(「aaa.bat」と「aaa.com」と「aaa.exe」があった場合、「aaa.bat」が実行される。)
A−VXは「LM -> JS」、Windowsは「バッチ -> exeファイル」の順番になるので、ちょうど逆になります。
表の内容について補足説明します。
1は、下のようにDEV=もFIL=も書いた場合です。
AAA,DEV=MSD000,FIL=USERLML;
2の例は、下のようにDEV=だけ書いた場合です。
この場合は、SYS@LML->SYS@JSL->SYS@PMLの順番にサーチされるので、USERLMLにAAAが入っていても認識されません。
SYS@LMLかSYS@JSLかSYS@PMLにAAAが入っていれば、それを実行します。もしこの3つのファイルのどれにもAAAが入っていなければエラーになります。
AAA,DEV=MSD000;
3の例は、下のようにFIL=だけ書いた場合です。
もし、USERLMLがSRV(MSD000)にあるのならば、AAAは実行されます。
SRV以外の装置(MSD001、MSD002等)にあるのならば、サーチされないので実行されません。
AAA,FIL=USERLML;
4は説明が複雑ですね。
下のようにDEV=もFIL=も書かなかった場合です。
AAA;
RUNコマンドは、画面上のRUNコマンド行から直接RUNコマンドを打ち込んで実行した場合です。
/RUNステートメントとは、JSやPM内で使うジョブ制御言語のうちの1つで、このコマンドでLMやJSやPMを実行することができます。
内部コール命令は、COBOLを例に挙げると「STOP RUN命令」やRUNマクロ、SPAWNマクロなどがそれにあたります。
4の動作説明文中について補足すると、
プライベートロードモジュールライブラリとは、実行中のLMが入っているLMLのことです。
例えば、装置「MSD000」の「USERLML」というライブラリにある「AAA」というLMを実行していたら、「MSD000」の「USERLML」がプライベートロードモジュールライブラリとなります。
「AAA」から内部コール命令で「BBB」というLMを実行したら、まず「AAA」のプライベートロードモジュールライブラリである「USERLML」中に「BBB」があるかどうか探して、無ければ次にSRVの「SYS@LML」を探しにいきます。(当然DEV=もFIL=も指定していない場合の話です。)
これはWindowsで、あるプログラム(a.exe)からべつのプログラム(b.exe)を実行するときに、まずa.exeのあるカレントフォルダでb.exeを探して、次に環境変数のPATH=に定義されているフォルダにb.exeを探しにいく、という動作をするのと同じです。