前へ | 次へ | 目次 | 索引 |
現在のプロセス,グループ内のすべてのプロセス(現在のプロセスが group 特権を持つ場合),およびシステム上のすべてのプロセス(現在のプロセスが world 特権を持つ場合)についての統計情報を戻します。F$PID,F$EXTRACT,および F$GETJPI レキシカル関数の使用方法を示します。
$ ! $ ! 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 |
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 を呼び出せば,呼び出し側プロシージャに渡されたパラメータの数を判別できます。
$ ! 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 |
IF コマンドを実行するたびに,COUNT シンボルは異なる値を持つ。1 回目は,COUNT の値は 1 で,IF コマンドは P1 をチェックし,2 回目は,P2 をチェックし,以下も同様である。
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 エディタを繰り返し起動して,同じファイル・タイプを持つファイルのグループを編集します。このプロシージャは,レキシカル関数を使用して出力からファイル名を取り出す方法を示しています。また,コマンド・プロシージャの中で起動されたプログラムの入力ストリームを再定義する方法も示しています。
$ ! 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 |
CLOSE コマンドは,DIRECTORY コマンドの出力ファイルをクローズし,/ERROR 修飾子はファイルの中の次の行のラベルを指定する。このように/ERROR 修飾子を使用すると,ディレクトリ・ファイルがオープンされていないときに表示されるはずのエラー・メッセージが出されなくなる。このような状況は,ディレクトリ・ファイルをオープンする前に Ctrl/Y を押した場合などに生じる。
クリーンアップ処理の 2 番目のステップは,一時ディレクトリ・ファイルを削除することである。
$ @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 ユーティリティでテキスト・エディタを起動しています。
$ ! 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 |
$ RUN XYZ_EDITOR.EXE /INPUT= 'P1' /OUTPUT='P2'
$ 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. |
前へ | 次へ | 目次 | 索引 |