OpenVMS
ユーザーズ・マニュアル


前へ 次へ 目次 索引



第 17 章
レキシカル関数: 情報の取得と処理方法

レキシカル関数は,DCL インタプリタが評価して置換するコマンド言語構造です。 DCL インタプリタはレキシカル関数を検出すると,まずこれを評価し置換した後でコマンド文字列を解釈します。本章では,次のことを説明します。

レキシカル関数についての詳しい説明は,オンライン・ヘルプを参照してください。本章で説明するコマンドについての詳細は,『Compaq OpenVMS DCL ディクショナリ』を参照してください。

17.1 レキシカル関数について

レキシカル関数を使用すると,次のことに関する情報を入手できます。

多くのレキシカル関数が戻す情報は,DCL コマンドからも得ることができます。

17.1.1 情報の取得

コマンドから情報を得るよりもレキシカル関数から情報を得た方が,コマンド・プロシージャの中で情報を処理しやすくなります。たとえば,F$ENVIRONMENT 関数または SHOW DEFAULT コマンドのどちらを使用しても,現在の省略時のディレクトリの名前を得ることができます。ただし,次の点が異なります。

17.2 プロセスについての情報

コマンド・プロシージャを実行している間,プロセス属性を頻繁に変更し,その後で属性を復元します。次のレキシカル関数を使用すれば,プロセスに関する情報を入手できます。

F$DIRECTORY 現在の省略時のディレクトリ文字列を戻す。
F$ENVIRONMENT ユーザ・プロセスのコマンド環境についての情報を戻す。
F$GETJPI ユーザ・プロセスまたはシステム上の他のプロセスについての会計情報,状態,識別情報を戻す。
F$MODE プロセスを実行中のモードを示す。
F$PRIVILEGE ユーザ・プロセスに特権が指定されているかどうかを示す。
F$PROCESS プロセスの名前を戻す。
F$SETPRV 指定された特権を設定する。指定された特権が, F$SETPRV 関数を使用する前に使用可能であったかどうかも示す。
F$USER UIC (ユーザ識別コード)を戻す。
F$VERIFY チェック機能のオンまたはオフを示す。

次の表は,コマンド・プロシージャで一般に変更されるプロセス属性を示しています。また,これらの属性をセーブするレキシカル関数と,元の設定を復元する DCL コマンドも示しています。

属性 操作 コマンドまたはレキシカル関数
制御文字 セーブ F$ENVIRONMENT("CONTROL")
  復元 SET CONTROL
     
DCL プロンプト セーブ F$ENVIRONMENT("PROMPT")
  復元 SET PROMPT
     
省略時の保護 セーブ F$ENVIRONMENT("PROTECTION")
  復元 SET PROTECTION/DEFAULT
キー状態 セーブ F$ENVIRONMENT("KEY_STATE")
  復元 SET KEY
     
メッセージ形式 セーブ F$ENVIRONMENT("MESSAGE")
  復元 SET MESSAGE
     
特権 セーブ F$PRIVILEGE または F$SETPRV
  復元 F$SETPRV または SET PROCESS/PRIVILEGES
     
チェック機能 セーブ F$VERIFY または F$ENVIRONMENT
  復元 F$VERIFY または SET VERIFY

プロセス属性をセーブした場合,エラーまたは Ctrl/Y による割り込みによって,元の属性を復元する前にプロシージャが終了することのないようにしなければなりません。エラーと Ctrl/Y による割り込みの処理については, 第 15 章 を参照してください。

17.2.1 チェック設定値の変更

F$VERIFY レキシカル関数を使用すると,コマンド・プロシージャが実行されている間だけチェック機能を無効にすることができます。このとき,ユーザは,プロシージャを実行しながらそのプロシージャの内容を表示することはできません。

チェック機能には,次の 2 つのタイプがあります。

省略時の設定では,SET [NO]VERIFY コマンドと F$VERIFY レキシカル関数は,両方のタイプのチェック機能をオン,オフします。通常は,プロシージャの中のプロージャおよびイメージ・チェック設定値は同じになっています (両方がオンか,両方がオフになっています)。ただし,設定値を変更する場合には,それぞれのチェック設定値を別々にセーブします。

次の例では,シンボル TEMP を使用して,チェック機能を有効および無効に設定します。


$ ! Enable verification 
$ ! 
$ TEMP = F$VERIFY(1) 
$ LOOP: 
$     INQUIRE FILE "File name" 
$     IF FILE .EQS."" THEN EXIT 
$     PRINT 'FILE' 
$     GOTO LOOP 
$ ! Disable verification 
$ ! 
$ TEMP = F$VERIFY(0) 
$ EXIT 

次の例では,チェック機能の設定がセーブされます。


$ ! Save each verification state 
$ ! Turn both states off 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") 
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) 
   .
   .
   .
$ ! Restore original verification states 
$ SAVE_VERIFY_IMAGE = F$VERIFY(SAVE_VERIFY_PROCEDURE,- 
      SAVE_VERIFY_IMAGE) 

上記の例で,F$ENVIRONMENT 関数は,現在のイメージ・チェック設定値を戻し,この値を SAVE_VERIFY_IMAGE シンボルに割り当てています。次に,F$VERIFY 関数が現在のプロシージャ・チェック設定値を戻し,この値を SAVE_VERIFY_PROCEDURE シンボルに割り当てています。 F$VERIFY 関数は,イメージ・チェックとプロシージャ・チェックの両方を無効にします。 F$ENVIRONMENT 関数を使用すれば,F$VERIFY によってチェック機能を無効にする前にプロシージャ・チェック設定値を得ることができます。ただし,上記の例に示すように,F$VERIFY を使用して 1 つのコマンド行の中で両方のタスクを行った方がプロシージャの長さが短くてすみます。

プロシージャの終わりに,F$VERIFY 関数で元の設定値 (シンボル SAVE_VERIFY_PROCEDURE と SAVE_VERIFY_IMAGE によって指定される) を復元しています。

注意

時刻印字を使用する場合,チェック機能が使用可能な場合にだけ適用されることに注意してください。時刻印字と SET PREFIX コマンドについての詳細は,『Compaq OpenVMS DCL ディクショナリ』または DCL ヘルプを参照してください。

17.2.2 省略時のファイル保護の変更

コマンド・プロシージャの中で省略時のファイル保護を変更したい場合があります。次のコマンド・プロシージャは,プロシージャの実行中に作成されたファイルに関連する省略時の保護を変更します。この場合,終了する前に元の省略時のファイル保護を復元しています。


$ SAVE_PROT = F$ENVIRONMENT("PROTECTION") 
$ SET PROTECTION = (SYSTEM:RWED, OWNER:RWED, GROUP, WORLD)/DEFAULT 
   .
   .
   .
$ SET PROTECTION=('SAVE_PROT')/DEFAULT 
$ EXIT 

この例で,F$ENVIRONMENT 関数は,SET PROTECTION コマンドの構文を使用して省略時の保護コードを戻しています。このため,SET PROTECTION コマンドと一緒に SAVE_PORT シンボルを使用して元の省略時のファイル保護を復元できます。

17.3 システムについての情報

システムについての情報を得るには,次のレキシカル関数を使用します。

F$CONTEXT F$PID 関数と一緒に使用する場合の選択基準を指定する。 F$CONTENT 関数と一緒に F$PID 関数を使用すると,OpenVMS Cluster の任意のノードのプロセスについての情報を得ることができる。
F$CSID VMS クラスタ識別番号を戻して,システムのVMS クラスタ・ノード・リストの中の現在の位置を指すようにコンテキスト・シンボルを更新する。
F$GETQUI システム・ジョブ・キュー・ファイルに収められたキュー,現在キューの中にあるバッチ・ジョブと印刷ジョブ,フォーム定義,属性定義についての情報を戻す。
F$GETSYI ローカル・システムまたは VMS クラスタ内のノード (システムが VMS クラスタの一部である場合) についての情報を戻す。
F$IDENTIFIER 識別子を指定された形式から数値形式に,または数値形式から指定された形式に変換する。
F$MESSAGE 状態コードに関連するメッセージ・テキストを戻す。
F$PID ユーザがチェックすることが許容されているプロセスのプロセス識別番号 (PID) を戻す。
F$TIME 現在の日時を戻す。

17.3.1 OpenVMS Clusterノード名の決定

使用中のシステムがネットワークまたは OpenVMS Clusterの一部で,多数のノードにログインできる場合には,現在使用中のノードを示すように DCL プロンプトを設定できます。このためには,ログイン・コマンド・プロシージャの中に F$GETSYI 関数を指定して,ノード名を判別します。次に,SET PROMPT コマンドを使用して,ノード固有のプロンプトを設定します。

プロンプト文字列の中でノード名の一部分だけを使用したい場合には, F$EXTRACT 関数を使用して,該当する文字を取り出します。文字の取り出しについては, 第 17.6.2 項 を参照してください。

次の例では,シンボル NODE が FF$GETSYI("NODENAME") として定義され,その後,ノード名がプロンプトとして使用されます。


$ NODE = F$GETSYI("NODENAME") 
$ SET PROMPT = "''NODE'$ " 
   .
   .
   .

17.3.2 キューについての情報

F$GETQUI 関数を使用すると,バッチ・キューと印刷キューについての各種の情報を得ることができます。キューの中のジョブやファイルについての情報を得るには,該当ジョブに対する読み込みアクセス権か SYSPRV または OPER 特権を持っていなくてはなりません。

次の例は,バッチ・キュー VAX1_BATCH が終了状態にあるかどうかを判別する方法を示しています。戻される値は真か偽のいずれかです。キューが終了状態にない場合には,コマンド・プロシージャはジョブをキューに登録します。


$ QSTOPPED = F$GETQUI("DISPLAY_QUEUE", "QUEUE_STOPPED", "VAX1_BATCH") 
$ IF QSTOPPED THEN GOTO NOBATCH 
$ SUBMIT/QUEUE=VAX1_BATCH TEST.COM 
$ NOBATCH: 
   .
   .
   .
 

17.3.3 プロセスについての情報

F$PID 関数を使用すると,チェックすることが許容されているすべてのプロセスのプロセス識別番号 (PID) を得ることができます。

PID 番号を入手した後,F$GETJPI 関数を使用すれば,プロセスに関する特定の情報を入手できます。

次の例は,チェックすることが許容されているプロセスの PID を得て表示する方法を示しています。


$ ! Display the time when this procedure 
$ ! begins executing 
$ WRITE SYS$OUTPUT F$TIME() 
$ ! 
$ CONTEXT = "" 
$ START: 
$ ! Obtain and display PID numbers until 
$ ! F$PID returns a null string 
$ ! 
$ PID = F$PID(CONTEXT) 
$ IF PID .EQS. "" THEN EXIT 
$ WRITE SYS$OUTPUT "Pid --- ''PID'" 
$ GOTO START 

システムは CONTEXT シンボルを使用して,ポインタを PID のシステム・リストに保持しています。ループを通過するたびに,ポインタを変更して,リストの中の次の PID を指すようにします。すべての PID が表示されると,プロシージャは終了します。

次のプロシージャは,PID とそれぞれのプロセスの UIC を表示します。


$ CONTEXT = "" 
$ START: 
$ ! Obtain and display PID numbers and UICs 
$ ! 
$ PID = F$PID(CONTEXT) 
$ IF PID .EQS. "" THEN EXIT 
$ UIC = F$GETJPI(PID,"UIC") 
$ WRITE SYS$OUTPUT "Pid --- ''PID'   Uic--- ''UIC' " 
$ GOTO START 

WRITE コマンドの中に F$GETJPI 関数を指定すれば,このコマンド・プロシージャを短くできます。


$ CONTEXT = "" 
$ START: 
$ PID = F$PID(CONTEXT) 
$ IF PID .EQS. "" THEN EXIT 
$ WRITE SYS$OUTPUT "Pid --- ''PID'   Uic --- ''F$GETJPI(PID,"UIC")'" 
$ GOTO START 

17.3.4 F$CONTEXT レキシカル関数

OpenVMS Cluster 内の任意のノードからプロセスに関する情報を入手するには, F$CONTEXT 関数を使用します。

次の例では,選択基準を設定するために F$CONTEXT が 3 回呼び出されています。


$!Establish an error and Ctrl/Y handler 
$! 
$ ON ERROR THEN GOTO error 
$ ON CONTROL_Y THEN GOTO error 
$! 
$ ctx = "" 
$ temp = F$CONTEXT ("PROCESS", ctx, "NODENAME", "*","EQL") (1)
$ temp = F$CONTEXT ("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL") (2)
$ temp = F$CONTEXT ("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL") (3)
$! 
$!Loop over all processes that meet the selection criteria. 
$!Print the PID number and the name of the image for each process. 
$! 
$loop: (4)
$ pid = F$PID(ctx) 
$ IF pid .EQS. "" 
$ THEN 
$     GOTO endloop 
$ ELSE 
$     image = F$GETJPI(pid,"IMAGNAME") (5)
$     SHOW SYMBOL pid 
$     WRITE SYS$OUTPUT image (6)
$     GOTO loop 
$ ENDIF 
$!The loop over the processes has ended. 
$! 
$endloop: 
$! 
$ EXIT 
$! 
$!Error handler. Clean up the context's memory with 
$!the CANCEL selection item keyword. 
$! 
$error: 
$ IF F$TYPE(ctx) .eqs. "PROCESS_CONTEXT" THEN - (7)
-$ temp = F$CONTEXT ("PROCESS", ctx, "CANCEL") (8)
$! 
$ EXIT 

例を調べる場合には,次のことに注意してください。

  1. 最初の呼び出しでは,検索が OpenVMS Cluster のすべてのノードで実行されることを要求する。

  2. 2 番目の呼び出しでは,ユーザ名が M から始まるプロセス,またはユーザ名が SYSTEM であるプロセスだけを処理することを要求する。

  3. 3 番目の呼び出しでは,現在の特権に SYSPRV (システム特権) と OPER (オペレータ特権) の両方が含まれており,他の特権も持つことができるプロセスだけを選択する。

  4. "loop" と "endloop" というラベルの間のコマンド行は, F$PID を継続的に呼び出して, F$CONTEXT 呼び出しで設定された条件を満足するプロセスを入手する。

  5. 各 PID 番号を検索した後,F$GETJPI が呼び出され,プロセスで実行中のイメージの名前が戻される。

  6. 最後に,プロシージャはイメージの名前を表示する。

  7. エラーが発生したり,Ctrl/Y が押された場合には,制御は error に渡され,必要に応じてコンテキストは閉じられる。

  8. シンボル・タイプ PROCESS_CONTEXT のチェックに注意しなければならない。シンボルがこのタイプである場合には,F$CONTEXT を呼び出すことにより,選択条件を取り消さなければならない。シンボルが PROCESS_CONTEXT タイプでない場合には,選択条件が F$CONTEXT でまだ設定されていないか,またはエラーが発生するかプロセス・リストの最後に到達するまで, F$PID に対してシンボルが使用されていた。


前へ 次へ 目次 索引