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


前へ 次へ 目次 索引


B.4 SYS.COM コマンド・プロシージャ

現在のプロセス,グループ内のすべてのプロセス(現在のプロセスが group 特権を持つ場合),およびシステム上のすべてのプロセス(現在のプロセスが world 特権を持つ場合)についての統計情報を戻します。F$PID,F$EXTRACT,および F$GETJPI レキシカル関数の使用方法を示します。

例: SYS.COM


$ ! 
$ ! Displays information about owner, group, or system processes. 
$ ! 
$ ! Turn off verification and save current settings 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ CONTEXT = ""                     ! Initialize PID search context  (1)
$ ! 
$ ! Output header line. 
$ ! 
$ WRITE SYS$OUTPUT "   PID    Username    Term    Process " + -     (2)
         "name   State   Pri Image" 
$ ! 
$ ! Output process information. 
$ ! 
$LOOP: 
$ ! 
$ ! Get next PID.  If null, then done. 
$ ! 
$       PID = F$PID(CONTEXT)                              (3)
$       IF PID .EQS. "" THEN GOTO DONE 
$ ! 
$ ! Get image file specification and extract the file name. 
$ ! 
$       IMAGNAME = F$GETJPI(PID,"IMAGNAME")               (4)
$       IMAGNAME = F$PARSE(IMAGNAME,,,"NAME","SYNTAX_ONLY")
$ ! 
$ ! Get terminal name.  If none, then describe type of process. 
$ ! 
$       TERMINAL = F$GETJPI(PID,"TERMINAL")               (5)
$       IF TERMINAL .EQS. "" THEN - 
                TERMINAL = "-"+F$EXTRACT(0,3,F$GETJPI(PID,"MODE"))+"-" 
$       IF TERMINAL .EQS. "-INT-" THEN TERMINAL = "-DET-" 
$       IF F$GETJPI(PID,"OWNER").NE. 0 THEN TERMINAL = "-SUB-" 
$ ! 
$ ! Get more information, put process line together, 
$ ! and output it. 
$ ! 
$       LINE = F$FAO("!AS !12AS !7AS !15AS !5AS !2UL/!UL !10AS", - (6)
                PID,F$GETJPI(PID,"USERNAME"),TERMINAL,- 
                F$GETJPI(PID,"PRCNAM"),- 
                F$GETJPI(PID,"STATE"),F$GETJPI(PID,"PRI"),- 
                F$GETJPI(PID,"PRIB"),IMAGNAME)
$       WRITE SYS$OUTPUT LINE 
$       GOTO LOOP 
$ ! 
$ ! Restore verification and exit. 
$ ! 
$DONE: 
$  SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$  EXIT 

SYS.COM コマンド・プロシージャの説明

  1. CONTEXT シンボルが空の値で初期化される。このシンボルをF$PID 関数と一緒に使用すると,プロセス識別番号のリストを得ることができる。

  2. ヘッダを書き込む。

  3. 最初のプロセス識別(PID)番号を得る。現在のプロセスに group または world 特権がない場合には,現在のプロセスの PID 番号が戻される。現在のプロセスが group 特権を持っている場合には,グループ・リストの中の最初の PID 番号が戻され,現在のプロセスが world 特権を持っている場合には,システム・リストの中の最初の PID 番号が戻される。最後の PID 番号が戻されるまで,順に PID 番号を戻し続ける。この時点で,空の文字列が戻され,プロシージャの終わりに分岐する。

  4. F$GETJPI レキシカル関数を使用して,それぞれの PID 番号のイメージ・ファイル指定を得る。F$PARSE 関数は,F$GETJPI 関数が戻す指定からファイル名を取り出す。

  5. F$GETJPI 関数を使用して,それぞれの PID 番号のターミナル名を得る。F$EXTRACT 関数は,F$GETJPI(PID,"MODE")が戻す MODE 指定の最初の 3 文字を取り出して,プロセスのタイプを判別する。F$GETJPI 関数をもう一度使用して,プロセスがサブプロセスかどうかを判別する。

  6. F$GETJPI レキシカル関数を使用して,ユーザ名,プロセス名,プロセス状態,プロセス優先順位,戻されたそれぞれの PID 番号のプロセスの基本優先順位を得る。F$FAO レキシカル関数は,この情報を画面に合わせてフォーマットする。

SYS.COM コマンド・プロシージャの実行結果例


$ @SYS


   PID    Username    Term    Process name   State   Pri Image 
00050011  NETNONPRIV   -NET-   MAIL_14411      LEF    9/4 MAIL 
00040013  STOVE        RTA6:   STOVE           LEF    9/4 
00140015  MAROT        -DET-   DMFB0ACP        HIB    9/8 F11BAC 
00080016  THOMPSON     -DET-   MTA0ACP         HIB   12/8 MTAAACP 
00070017  JUHLES       TTF1:   JUHLES          LEF    9/4 
   .
   .
   .
00040018  MARCO        TTA2:   MARCO           HIB    9/4 RTPAD 
0018001A  VERN         RTA3:   VERN            LEF    9/4 
0033001B  YISHA        RTA7:   YISHA           CUR    4/4 
0002004A  SYSTEM       -DET-   ERRFMT          HIB   12/7 ERRFMT 

このプロシージャは,システム上のすべてのプロセスに関する情報を戻します。現在のプロセスは world 特権を持っています。

B.5 GETPARMS.COM コマンド・プロシージャ

このコマンド・プロシージャは,プロシージャに渡すパラメータの数を戻します。別のプロシージャから GETPARMS.COM を呼び出せば,呼び出し側プロシージャに渡されたパラメータの数を判別できます。

例: GETPARMS.COM


 
 
$ ! Procedure to count the number of parameters passed to a command 
$ ! procedure.  This number is returned as the global symbol PARMCOUNT. 
$ ! 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")       (1)
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ ! 
$ IF P1 .EQS. "?" THEN GOTO TELL                           (2)
$ ! 
$ ! Loop to count the number of parameters passed.  Null parameters are 
$ ! counted until the last non-null parameter is passed. 
$ ! 
$       COUNT = 0                                          (3)
$       LASTNONNULL = 0 
$ LOOP: 
$       IF COUNT .EQ. 8 THEN GOTO END_COUNT 
$       COUNT = COUNT + 1 
$       IF P'COUNT' .NES. "" THEN LASTNONNULL = COUNT 
$ GOTO LOOP 
$ ! 
$ END_COUNT:                                               (4)
$ ! 
$ ! Place the number of non-null parameters passed into PARMCOUNT. 
$ ! 
$ PARMCOUNT == LASTNONNULL 
$ ! 
$ ! Restore verification setting, if it was on, before exiting 
$ !                                                             (5)
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT 
$ ! 
$ TELL:                                                    (6)
$ TYPE SYS$INPUT 
        This procedure counts the number of parameters passed to 
        another procedure.  This procedure can be called by entering 
        the following string in any procedure: 
 
             @GETPARMS 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8 
 
        On  return,  the  global  symbol  PARMCOUNT 
        contains the number of parameters passed to the procedure. 
$ ! 
$ EXIT 

GETPARMS.COM コマンド・プロシージャの説明

  1. 現在のイメージとプロシージャのチェック設定値をセーブしてから,チェックをオフに設定する。

  2. 疑問符がパラメータとしてプロシージャに渡された場合には,TELL ラベル(注 6)に分岐する。

  3. プロシージャに渡されたパラメータ数をカウントするループが設定される。カウンタ COUNT と LASTNONNULL は,ループに入る前に 0 に初期化される。ループの中で,COUNT は増分され,8 の値になっているかどうかテストされる。COUNT が 8 に等しい場合には,最大数のパラメータが入力されている。空以外のパラメータが渡されるたびにLASTNONNULL はそのパラメータの番号に定義される。

    IF コマンドを実行するたびに,COUNT シンボルは異なる値を持つ。1 回目は,COUNT の値は 1 で,IF コマンドは P1 をチェックし,2 回目は,P2 をチェックし,以下も同様である。

  4. パラメータ・カウントが 8 になると,END_COUNT に分岐する。LASTNONNULL シンボルには,最後に渡された空以外のパラメータのカウントが入っている。この値はグローバル・シンボル PARMCOUNT に収められる。PARMCOUNT は,呼び出し側のコマンド・レベルで値をテストできるようにグローバル・シンボルとして定義しなくてはならない。

  5. 元のチェック設定値が復元される。

  6. TELL ラベルでは,TYPE コマンドが入力ストリームに収められたデータを表示する。コマンド・プロシージャの中では,入力ストリームはコマンド・プロシージャ・ファイルである。TYPE コマンドは,GETPARMS.COM の使用方法に関する命令を表示する。

GETPARMS.COM コマンド・プロシージャの実行結果例

SORTFILES.COM プロシージャは,3 つの空以外のパラメータを渡すようにユーザに要求します。SORTFILES.COM プロシージャには,次の行が入っています。


$ @GETPARMS 'P1' 'P2' 'P3' 'P4' 'P5' 'P6' 'P7' 'P8' 
$ IF PARMCOUNT .NE. 3 THEN GOTO NOT_ENOUGH 
   . 
   . 
   . 
$NOT_ENOUGH: 
$ WRITE SYS$OUTPUT - 
"Three non-null parameters required.  Type SORTFILES HELP for info." 
$ EXIT 

SORTFILES.COM プロシージャは,次のようにして起動できます。


$ @SORTFILES DEF 4
Three non-null parameters required. Type SORTFILE HELP for info. 

このプロシージャを正しく起動するには,すなわち,SORTFILES に渡されたパラメータをそのまま GETPARMS に渡して処理するには,シンボル P1 〜 P8 が 1 組の二重引用符で囲まれていなくてはなりません。

GETPARMS からの戻り値が 3 でない場合には,SORTFILES はエラー・メッセージを出力して終了します。

B.6 EDITALL.COM コマンド・プロシージャ

EDT エディタを繰り返し起動して,同じファイル・タイプを持つファイルのグループを編集します。このプロシージャは,レキシカル関数を使用して出力からファイル名を取り出す方法を示しています。また,コマンド・プロシージャの中で起動されたプログラムの入力ストリームを再定義する方法も示しています。

例: EDITALL.COM


 
 
$ ! Procedure to edit all files in a directory with a 
$ ! specified file type. Use P1 to indicate the file type. 
$ ! 
$ ON CONTROL_Y THEN GOTO DONE           ! Ctrl/Y action    (1)
$ ON ERROR THEN GOTO DONE 
$ ! 
$ ! Check for file type parameter.  If one was entered, continue; 
$ ! otherwise, prompt for a parameter. 
$ ! 
$ IF P1 .NES. "" THEN GOTO OKAY                            (2)
$ INQUIRE P1 "Enter file type of files to edit" 
$ ! 
$ ! List all files with the specified file type and write the DIRECTORY 
$ ! output to a file named DIRECT.OUT 
$ ! 
$ OKAY: 
$ DIRECTORY/VERSIONS=1/COLUMNS=1 -                         (3)
         /NODATE/NOSIZE - 
         /NOHEADING/NOTRAILING - 
         /OUTPUT=DIRECT.OUT *.'P1' 
$ IF .NOT. $STATUS THEN GOTO ERROR_SEC                     (4)
$ ! 
$ OPEN/READ/ERROR=ERROR_SEC DIRFILE DIRECT.OUT             (5)
$ ! 
$ ! Loop to read directory file 
$ ! 
$ NEWLINE:                                                 (6)
$        READ/END=DONE DIRFILE NAME 
$        DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:   ! Redefine SYS$INPUT 
$        EDIT 'NAME'                               ! Edit the file 
$        GOTO NEWLINE 
$ ! 
$ DONE:                                                    (7)
$        CLOSE DIRFILE/ERROR=NOTOPEN               ! Close the file 
$ NOTOPEN: 
$        DELETE DIRECT.OUT;*                       ! Delete temp file 
$ EXIT 
$ ! 
$ ERROR_SEC: 
$        WRITE SYS$OUTPUT "Error:  ",F$MESSAGE($STATUS)
$        DELETE DIRECT.OUT;* 
$ EXIT 

EDITALL.COM コマンド・プロシージャの説明

  1. ON コマンドは,このプロシージャの条件処理を設定する。このプロシージャの実行時に Ctrl/Y が押されると,DONE ラベルに分岐する。同様に,エラーまたは重大エラーが生じても,DONE ラベルに分岐する。

  2. パラメータが入力されたかどうかをチェックする。入力されていない場合には,ファイル・タイプを求めるプロンプトを出す。

  3. DIRECTORY コマンドは,P1 として指定されたファイル・タイプを持つすべてのファイルをリストする。コマンド出力は DIRECT.COM ファイルに書き込まれる。/VERSIONS=1 修飾子は,それぞれのファイルの最も大きいバージョン番号だけをリストするように要求する。NOHEADING 修飾子と/NOTRAILING 修飾子は,出力に見出し行やディレクトリ要約を含めないように要求する。/COLUMNS=1 修飾子は,レコードごとにファイル名が 1 つずつ指定されるようにする。

  4. IF コマンドは,$STATUS の値をテストすることによって,DIRECTORY コマンドからの戻り値をチェックする。DIRECTORY コマンドが正しく実行されないと,$STATUS は偶数の整数値になり,プロシージャはERROR_SEC ラベルに分岐する。

  5. OPEN コマンドは,ディレクトリ出力ファイルをオープンして,それに論理名 DIRFILE を指定する。

  6. READ コマンドは,DIRECTORY コマンド出力の行をシンボル名 NAME に読み込む。すべての行を読み込むと,DEFINE コマンドを使用して,編集セッションの入力ストリーム(SYS$INPUT)がターミナルになるように再定義する。次に,エディタを起動して,NAME シンボルをファイル指定として指定する。編集セッションが完了すると,コマンド・インタプリタは,コマンド・プロシージャの中の次の行を読み込んで,NEWLINE ラベルに分岐する。ディレクトリの中にある指定されたファイル・タイプのすべてのファイルを編集すると,DONEラベルに分岐する。

  7. DONE ラベルは,READ コマンドの /END 修飾子のターゲット・ラベルであるとともに,プロシージャの始めに設定された ON CONTROL_Y 条件と ON ERROR 条件のターゲット・ラベルでもある。このラベルでは,クリーンアップ処理を行う。

    CLOSE コマンドは,DIRECTORY コマンドの出力ファイルをクローズし,/ERROR 修飾子はファイルの中の次の行のラベルを指定する。このように/ERROR 修飾子を使用すると,ディレクトリ・ファイルがオープンされていないときに表示されるはずのエラー・メッセージが出されなくなる。このような状況は,ディレクトリ・ファイルをオープンする前に Ctrl/Y を押した場合などに生じる。

    クリーンアップ処理の 2 番目のステップは,一時ディレクトリ・ファイルを削除することである。

EDITALL.COM コマンド・プロシージャの実行結果例


$ @EDITALL DAT
*  .
   .
   .
%DELETE-I-FILDEL, device:[directory]DIRECT.OUT;1 deleted(x blocks)

EDITALL プロシージャが DAT として指定された P1 によって起動されます。このプロシージャは,省略時のディレクトリにあるファイル・タイプ DAT を持つすべてのファイルのディレクトリ・リストを作成し,エディタを起動してそれぞれのファイルを編集します。ファイル・タイプ DAT を持つ最後のファイルを編集し終わると,一時ファイル DIRECT.OUT を削除して,ターミナルにメッセージを表示します。

B.7 MAILEDIT.COM コマンド・プロシージャ

このコマンド・プロシージャは,MAIL ユーティリティでテキスト・エディタを起動しています。

例: MAILEDIT.COM


 
 
$ ! Command procedure to invoke an editor for Mail. 
$ ! 
$ ! Inputs: 
$ ! 
$ !     P1 = Input file name. 
$ !     P2 = Output file name. 
$ ! 
$ ! If MAIL$EDIT is undefined, Mail will invoke the user's selected 
$ ! callable editor set by the mail SET EDITOR command. 
$ ! 
$ ! If MAIL$EDIT is defined to be a command procedure, Mail will create 
$ ! a subprocess to edit the mail, but any SET EDITOR command in Mail 
$ ! will override the definition of MAIL$EDIT for the remainder of that 
$ ! Mail session. 
$ ! 
$ ! Note that this procedure is run in the context of a subprocess. 
$ ! LOGIN.COM is not executed.  However, all process logical names 
$ ! and DCL global symbols are copied.  In particular, note that the 
$ ! user's individual definition of the symbol EDIT is used if there 
$ ! is one. Otherwise, the system default editor is used. 
$ ! 
$ ! The default directory is the same as the parent process 
$ ! 
$ DEFINE /USER SYS$INPUT 'F$TRNLNM("SYS$OUTPUT")'          (1)
$ IF P1 .EQS. "" THEN GOTO NOINPUT                         (2)
$ EDIT /OUTPUT='P2' 'P1'                                   (3)
$ EXIT 
$NOINPUT: 
$ EDIT 'P2'                                                (4)
$ EXIT 

MAILEDIT.COM コマンド・プロシージャの説明

  1. DEFINE コマンドは,エディタ入力をコマンド・ファイルからではなく,ターミナルから得られるようにする。

  2. IF 文は,異なる出力ファイル名を持つファイルを編集することと,同じファイル名を持つファイルを編集することを区別する。

  3. この EDIT コマンドは,入力ファイル名と出力ファイル名でエディタを起動する。この行を,たとえば次のように編集すると,ユーザが選択したエディタを起動できる。

    $ RUN XYZ_EDITOR.EXE /INPUT= 'P1' /OUTPUT='P2'

  4. この EDIT コマンドは,1 つのファイル名でエディタを起動する。この行を,たとえば次のように編集すると,ユーザが選択したエディタを起動できる。

    $ RUN XYZ_EDITOR.EXE /INPUT= 'P2' /OUTPUT='P2'

MAILEDIT.COM コマンド・プロシージャの実行結果例


$DEFINE MAIL$EDIT MAILEDIT.COM
$MAIL
MAIL> SHOW EDITOR
Your editor is defined by the file MAILEDIT.COM.


前へ 次へ 目次 索引