| 前へ | 次へ | 目次 | 索引 |
所定の時間にターミナルに催促メッセージを表示します。このプロシージャは,メッセージを表示したい時間とメッセージのテキストを求めるプロンプトを出し, CONVERT.COM を使用して時間をデルタ時間に変換します。次に,指定された時間まで待ってから催促メッセージを表示するサブプロセスを生成します。 F$ENVIRONMENT,F$VERIFY,および F$GETDVI 関数の使用方法を示します。
$ ! Procedure to obtain a reminder message and display this
$ ! message on your terminal at the time you specify.
$ !
$ ! Save current states for procedure and image verification
$ ! Turn verification off for duration of procedure
$
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") (1)
$ SAVE_VERIFY_PROC = F$VERIFY(0)
$ !
$ ! Places the current process in a wait state until a specified
$ ! absolute time. Then, it rings the bell on the terminal and
$ ! displays a message.
$ !
$ ! Prompt for absolute time
$ !
$
$ GET_TIME:
$ INQUIRE REMINDER_TIME "Enter time to send reminder (hh:mm)" (2)
$ INQUIRE MESSAGE_TEXT "Enter message"
$ !
$ ! Call the CONVERT.COM procedure to convert the absolute time
$ ! to a delta time
$ !
$ @DISK2:[JONES.TOOLS]CONVERT 'REMINDER_TIME' (3)
$ IF .NOT. $STATUS THEN GOTO BADTIME
$ !
$ !
$ ! Create a command file that will be executed
$ ! in a subprocess. The subprocess will wait until
$ ! the specified time and then display your message
$ ! at the terminal. If you are working at a DEC_CRT
$ ! terminal, the message has double size blinking
$ ! characters. Otherwise, the message has normal letters.
$ ! In either case, the terminal bell rings when the
$ ! message is displayed.
$
$ CREATE WAKEUP.COM (4)
$ DECK ! Lines starting with $ are data lines
$ WAIT 'WAIT_TIME' (5)
$ BELL[0,7] = %X07 ! Create symbol to ring the bell
$ IF F$GETDVI("SYS$OUTPUT","TT_DECCRT") .NES. "TRUE" THEN GOTO OTHER_TERM
$ !
$ DEC_CRT_ONLY:
$ ! Create symbols to set special graphics (for DEC_CRT terminals only)
$ !
$ SET_FLASH = "<ESC>[1;5m" ! Turn on blinking characters
$ SET_NOFLASH = "<ESC>[0m" ! Turn off blinking characters
$ TOP = "<ESC>#3" ! Double size characters (top portion)
$ BOT = "<ESC>#4" ! Double size characters (bottom portion)
$ !
$ ! Write double size, blinking message to the terminal and ring the bell
$ !
$ WRITE SYS$OUTPUT BELL, SET_FLASH, TOP, MESSAGE_TEXT
$ WRITE SYS$OUTPUT BELL, BOT, MESSAGE_TEXT
$ WRITE SYS$OUTPUT F$TIME(), SET_NOFLASH
$ GOTO CLEAN_UP
$ !
$ OTHER_TERM:
$ WRITE SYS$OUTPUT BELL,MESSAGE_TEXT
$ WRITE SYS$OUTPUT F$TIME()
$ !
$ CLEAN_UP:
$ DELETE WAKEUP.COM;*
$ EOD
$ !
$ ! Now continue executing commands.
$ !
$ SPAWN/NOWAIT/INPUT=WAKEUP.COM (6)
$ END: (7)
$ ! Restore verification
$ SAVE_VERIFY_PROC = F$VERIFY(SAVE_VERIFY_PROC, SAVE_VERIFY_IMAGE)
$ EXIT
$ !
$ BADTIME:
$ WRITE SYS$OUTPUT "Time must be entered as hh:mm"
$ GOTO GET_TIME
|
REMINDER.COM コマンド・プロシージャの実行結果例
$ @REMINDER Enter time to send reminder (hh:mm): 12:00 Enter message: TIME FOR LUNCH %DCL-S-SPAWNED, process BLUTO_1 spawned $ . . . TIME FOR LUNCH 11-DEC-1996 12:00:56.99 |
時間値とメッセージを求めるプロンプトを出します。次に,メッセージを表示するサブプロセスを生成します。ユーザがターミナルで作業を継続していても,サブプロセスは,指定された時間になると,ターミナル・ベルを鳴らしたり,ユーザのメッセージを表示したり,時間を表示したりします。
C.3 DIR.COM コマンド・プロシージャ
DCL コマンド・プロシージャ DIRECTORY/SIZE=ALL/DATE を模倣して,指定されたファイルの(使用済みと割り当てられた)ブロック・サイズと作成日を表示します。 F$PARSE,F$SEARCH,F$FILE_ATTRIBUTES,および F$FAO レキシカル関数の使用方法を示します。
$ !
$ ! Command procedure implementation of DIRECTORY/SIZE=ALL/DATE
$ ! command
$ !
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ !
$ ! Replace any blank field of the P1 file specification with
$ ! a wildcard character
$ !
$ P1 = F$PARSE(P1,"*.*;*") (1)
$ !
$ ! Define initial values for symbols
$ !
$ FIRST_TIME = "TRUE"
$ FILE_COUNT = 0
$ TOTAL_ALLOC = 0
$ TOTAL_USED = 0
$
$ LOOP: (2)
$ FILESPEC = F$SEARCH(P1)
$ ! Find next file in directory
$ IF FILESPEC .EQS. "" THEN GOTO DONE
$ ! If no more files, then done
$ IF .NOT. FIRST_TIME THEN GOTO SHOW_FILE
$ ! Print header only once
$ !
$ ! Construct and output the header line
$ !
$ FIRST_TIME = "FALSE" (3)
$ DIRSPEC = F$PARSE(FILESPEC,,, "DEVICE") -
+F$PARSE(FILESPEC,,, "DIRECTORY")
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "Directory ",DIRSPEC
$ WRITE SYS$OUTPUT ""
$ LASTDIR = DIRSPEC
$
$ !
$ ! Put the file name together, get some of the file attributes, and
$ ! type the information out
$ !
$SHOW_FILE:
$ FILE_COUNT = FILE_COUNT + 1
$ FILENAME = F$PARSE(FILESPEC,,, "NAME") - (4)
+ F$PARSE(FILESPEC,,, "TYPE") -
+ F$PARSE(FILESPEC,,, "VERSION")
$ ALLOC = F$FILE_ATTRIBUTES(FILESPEC, "ALQ")
$ USED = F$FILE_ATTRIBUTES(FILESPEC, "EOF")
$ TOTAL_ALLOC = TOTAL_ALLOC + ALLOC
$ TOTAL_USED = TOTAL_USED + USED
$ REVISED = F$FILE_ATTRIBUTES(FILESPEC,"RDT")
$ LINE = F$FAO("!19AS !5UL/!5<!UL!> !17AS",FILENAME,-
USED, ALLOC, REVISED)
$ WRITE SYS$OUTPUT LINE
$ GOTO LOOP
$
$ !
$ ! Output summary information, reset verification, and exit
$ !
$ DONE: (5)
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "Total of ''FILE_COUNT' files, " + -
"''TOTAL_USED'/''TOTAL_ALLOC' blocks."
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT
|
$ @DIR [VERN]*.COM |
Directory DISK4:[VERN] BATCH.COM;1 1/3 11-DEC-1996 11:43 CALC.COM;3 1/3 11-DEC-1996 11:30 CONVERT.COM;1 5/6 11-DEC-1996 15:23 . . . LOGIN.COM;34 2/3 11-DEC-1996 13:17 PID.COM;7 1/3 11-DEC-1996 09:49 SCRATCH.COM;6 1/3 11-DEC-1996 11:29) Total of 15 files, 22/48 blocks. |
このプロシージャは,[VERN] ディレクトリのすべての COM ファイルに関する情報を戻します。
C.4 SYS.COM コマンド・プロシージャ
現在のプロセス,グループ内のすべてのプロセス (現在のプロセスが 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 特権を持っています。
C.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
|
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 はエラー・メッセージを出力して終了します。
| 前へ | 次へ | 目次 | 索引 |