前へ | 次へ | 目次 | 索引 |
$ X = F$CONTEXT("PROCESS", ctx, "NODENAME", "MYVAX", "EQL") |
いくつかの選択項目では,値をリストにすることもできます。この場合,各値はコンマ (.) で区切らなければなりません。たとえば,ノード名に MYVAX, HERVAX,および HISVAX を指定するには,次のように入力します。
$ X=F$CONTEXT("PROCESS",ctx,"NODENAME","MYVAX,HERVAX,HISVAX","EQL") |
ファイルを指定する場合と同様に,いくつかの値に対して,ワイルドカード文字(* や %)を使用できます。
たとえば,次に示すプロセス値のいずれか 1 つに基づいて選択するよう要求することにより,値を修飾できます。
リストの中には,キーワード ALL, ANY, EQL および NEQ で修飾されるものもあります。このようなリストは通常,複数の有効な特権から構成される,プロセス特権マスクのようなマスクです。各キーワードとその意味を次に示します。
複数の選択値を特定の選択修飾子と使用すると, (OR オペランドが指定されているかのように) 選択基準と一致するものを値とみなします。 (AND オペランドが指定されているかのように) 選択値は累積基準ではありません。
ALL は指定した値は存在しなければなりませんが,指定しない他の値も存在しても構いません。 EQL は指定した値は存在しなければなりませんが,指定しない他の値は存在してはなりません。これが,ALL と EQL の相違点です。たとえば,現在のプロセスが TMPMBX と OPER 特権を持っていて,他の特権を持っていても構わない場合は ALL を,他の特権を持っていてはならない場合は EQL をそれぞれ指定します。
F$CONTEXT 関数を使用して F$PID 関数の選択基準を設定します。F$CONTEXT 関数は,基準を作るときは何度でも呼び出せます。ただし,1 回の呼び出しにつき 1 つの項目しか指定できません。項目値リストが適切な位置に与えられれば,複数のコンテキストを同時に操作することができます。
適切な呼出しで選択基準を設定したら,F$PID を繰り返し呼出して, F$CONTEXT 関数で指定した基準と合う全てのプロセス識別番号 (PID) を戻します。基準と合うプロセスが無くなると,空文字列が戻されます。
F$PID 関数が呼び出されると,コンテキスト・シンボルは "frozen" とみなされます。つまり,対応する選択基準が削除されるまで,同じコンテキスト・シンボルでは F$CONTEXT を再び呼び出すことができません。同じコンテキスト・シンボルに追加の選択基準を設定しようとすると,エラー・メッセージが表示されますが,コンテキストと選択基準には影響しないため F$PID 関数の呼出しは続けることができます。
F$CONTEXT は,プロセス・メモリを使用して選択基準を格納します。ある 2 つの状況では,このメモリが削除されます。 F$PID 関数を呼出して空文字 ("") が戻されたとき,つまり選択基準に合う全てのプロセスが戻された場合と,呼出しの際に CANCEL というキーワードをコンテキストとともに使用した場合です。このタイプの呼出しは Ctrl/Y 操作や他の条件処理ルーチンに適しています。
#1 |
---|
$!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") $ temp = F$CONTEXT ("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL") $ temp = F$CONTEXT ("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL") $!Loop over all processes that meet the selection criteria. $!Print the PID and name of the image for each such process. $loop: $ pid = F$PID(ctx) $ IF pid .EQS. "" $ THEN $ GOTO endloop $ ELSE $ image = F$GETJPI(pid,"IMAGNAME") $ SHOW SYMBOL pid $ WRITE SYS$OUTPUT image $ 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 - temp = F$CONTEXT ("PROCESS", ctx, "CANCEL") $ EXIT |
この例では,選択基準を設置するために F$CONTEXT が 3 回呼び出されています。最初の呼び出しは,クラスタ内の全ノードを探索するよう指定しています。次の呼出しでは,ユーザ名が "M" で始まるか "SYSTEM" であるプロセスのみを対象とすることを指定しています。最後の呼出しでは, SYSPRV と OPER 特権の両方を持っているプロセスを選択することを指定しています。
ラベル "loop" と "endloop" で囲まれたコマンド行は, F$CONTEXT で設定した選択基準に合うプロセスを処理するため連続して F$PID を呼んでいます。各 PID を検索した後,そのプロセスが実行しているイメージ名を得るため F$GETJPI を呼び出しています。最後に,このプロシージャはイメージの名前を表示します。
エラーの場合,または CTRL/Y が押された場合は,制御は error に移され,( 必要であれば ) コンテキストがクローズされます。ここで,シンボル・タイプが PROCESS_CONTEXT であるか検査している点に注意してください。シンボル・タイプが PROCESS_CONTEXT であれば,選択基準は F$CONTEXT を使用して取り消さなければなりません。シンボル・タイプが PROCESS_CINTEXT ではない場合は,選択基準が設定されなかったか,または,F$PID 実行中にエラーが起きたかプロセス・リストが全て使用されたか,のいずれかです。
#2 |
---|
f$context("process",ctx,"prcnam ","symbiont*,mcote*","eql") f$context("process",ctx,"prcnam ","symbiont*,mcote* ","neq") f$context("process",ctx,"prcnam ","mcote* ","neq") f$context("process",ctx,"prcnam ","symbiont*","neq") |
この例では EQL と NEQ 選択値の違いを表す構文が 3 つ示してあります。最初の関数 ( EQL を指定 ) はプロセス名に symbiont と mcote を含むすべてのプロセスを戻します。2 番目と 3 番目の関数 ( NEQ を指定 ) は全てのプロセス ( プロセス名に symbiont がない,または mcote がないプロセス ) を戻すことに相当します。
OpenVMS Cluster システムから識別番号を戻し,システムのノード・リストの中で現在の位置を示すように,コンテキスト・シンボルを変更します。
F$CSID (コンテキスト・シンボル)
コンテキスト・シンボル
システムのノード・リストを示すポインタを格納するために, DCL が使用するシンボルを指定します。 F$CSID 関数は,このポインタを使用してクラスタ識別番号を戻します。シンボルを使用して コンテキスト・シンボル 引数を指定します。最初に F$CSID を呼び出す時は,指定したシンボルは未定義または空文字列でなければなりません。
コンテキスト・シンボル 引数が未定義または空文字列の場合, F$CSID 関数は,システムのノード・リストの最初のシステムの識別番号を返します。これ以降の呼出しでは,残りのクラスタ内のノードの識別番号がが順次返されます。
F$CSID 関数は,クラスタ識別番号を示す文字列を返し,システムのノード・リストで現在の位置を示すコンテキスト・シンボルを更新します。現在使用しているシステムがクラスタのメンバではない場合は,最初の戻り値は空文字です。
F$CSID 関数を使用すると,システム上のすべてのクラスタ識別番号を取り出せます。 F$GETSYI 関数を使用すると,特定のノードの情報を取り出せます。
最初の F$CSID 関数呼出しで,コンテキスト・シンボル 引数が初期化され,後続の F$CSID 関数呼出しはクラスタ内の他のノードのクラスタ識別番号を戻します ( クラスタ識別番号は,ランダムな順序で戻されます )。リスト内の最後のクラスタ識別番号を戻した後は,空文字列が戻されます。
#1 |
---|
$ IF F$GETSYI("CLUSTER_MEMBER") .EQS. "FALSE" THEN GOTO NOT_CLUSTER $ CONTEXT = "" $START: $ id = F$CSID (CONTEXT) $ IF id .EQS. "" THEN EXIT $ nodename = F$GETSYI ("NODENAME",,id) $ WRITE SYS$OUTPUT nodename $ GOTO start $NOT_CLUSTER: $ WRITE SYS$OUTPUT "Not a member of a cluster." $ EXIT |
このコマンド・プロシージャは,F$CSID 関数を使用してクラスタ内のシステム名を表示しています。代入式で,シンボル CONTEXT を宣言します。シンボル CONTEXT は, F$CSID 関数の コンテキスト・シンボル 引数として使用します。 CONTEXT には空文字列が割り当てられているので,F$CSID 関数は,クラスタ・ノード・リストの最初のクラスタ識別番号を戻します。
F$CSID 関数が空文字列を返すのは,コマンド・プロシージャがリストの終わりであるか,またはクラスタではないノードでこの操作を行おうとしているか,のどちらかの場合です。F$GETSYI 呼出しは,現在使用しているノードがクラスタのメンバか否かを確認します。コマンド・プロシージャは,この状態値で終了します。
F$CSID 関数が空文字列を返さなかった場合,このコマンド・プロシージャは F$GETSYI 関数の 3 番目の引数に識別番号を指定して,システム名を得ます。 WRITE コマンドを使用すると,このシステム名が表示されます。
文字列データからビット・フィールドを取り出し,その結果を符号付き値として整数に変換します。
F$CVSI (開始ビット,ビット数,文字列)
開始ビット
取り出される最初のビットのオフセットを指定します。オフセットは,文字列の下位(右端)ビットを位置番号 0 として判断します。オフセットは整数式として指定します。負の値を持つ式を指定した場合や,文字列のビット数を越える値を持つ式を指定した場合には, DCL は INVRANGEというエラー・メッセージを表示します。
ビット数
整数値に変換するために取り出されるビットの長さを指定します文字列のビット数以下でなければなりません。負の値を持つ式を指定した場合や,ビット位置オフセットに加算したときに,値が無効になる式を指定した場合には, DCL は INVRANGE というエラー・メッセージを表示します。
文字列
ビットが取り出される文字列を指定します。文字列は,文字列式として指定します。
#1 |
---|
$ A[0,32] = %X2B $ SHOW SYMBOL A A = "+..." $ X = F$CVSI(0,4,A) $ SHOW SYMBOL X X = -5 Hex = FFFFFFFB Octal = 177773 |
この例では,算術オーバーレイを使用して,2B という 16 進数を, A というシンボルの 32 ビットすべてに割り当てています。算術オーバレイについての詳細は,割り当て文 (=) の説明を参照してください。
シンボル A は未定義状態だったため,オーバレイが実行されたあと,このシンボルに文字列値が割り当てられます。シンボルが未定義の場合,算術オーバレイを実行すると,その結果として文字列値が割り当てられます。シンボルがすでに定義されている場合には,オーバレイを実行したあと,そのシンボルは,同じデータ・タイプのままです。 2B という 16 進数は,ASCIIのプラス記号(+) に対応します。
次に F$CVSI 関数は,シンボル A から下位4ビットを取り出します。下位4ビットには,B という 16 進数の 2進表現が含まれています。これらのビットが,符号付き値として整数に変換されます。変換後の値である -5 が,シンボル X に割り当てられます。
#2 |
---|
$ SYM[0,32] = %X2A $ SHOW SYMBOL SYM SYM = "*..." $ Y = F$CVSI(0,33,SYM) %DCL-W-INVRANGE, field specification is out of bounds - check sign and size $ SHOW SYMBOL Y %DCL-W-UNDSYM, undefined symbol - check spelling |
この例では F$CVSI 関数に指定された幅引数が大きすぎたため, DCL がエラー・メッセージを実行しシンボル Y に値を割り当てていません。
絶対時刻,または複合時刻文字列を yyyy-mm-dd hh:mm:ss.cc という形式の文字列に変換します。また F$CVTIME 関数は,絶対時刻,デルタ時間,またはそれらの組み合せの文字列に関する情報も戻します。
F$CVTIME ([入力時刻][,出力時刻形式][,フィールド])
入力時刻
絶対時刻,デルタ時間,または複合時刻を含む文字列,あるいは TODAY,TOMORROW,YESTERDAY のいずれかを指定します。入力時刻文字列は,文字列式として指定します。入力時刻 引数を省略した場合,または空文字列 ("") が指定された場合は,絶対時刻形式での現在のシステムの日付が使用されます。日付けフィールドの一部が省略された場合は,省略された値は現在の日付の対応する値になります。時刻フィールドの一部が省略された場合は,省略された値は 0 になります。
時刻値の指定についての詳細は,『OpenVMS ユーザーズ・マニュアル』,またはオンライン・ヘルプの DCL_Tips トピック (Date_Time サブトピック) を参照してください。
入力時刻 引数がデルタ時間の場合は, 出力時刻形式 引数として DELTA を指定しなければなりません。
出力時刻形式
戻される情報の時刻形式を指定します。出力時刻形式引数は,次のいずれかの文字列を指定します。
ABSOLUTE 要求された情報が,絶対時刻形式 ( dd-mmm-yyyy hh:mm:ss.cc) で戻されるように指定します。 dd が 1 桁の場合,先行の 0 や空白文字は戻されません。 COMPARISON
(省略時の設定)要求された情報が, yyyy-mm-dd hh:mm:ss.cc という形式で戻されるように指定します。 DELTA 要求された情報が,デルタ形式 dddd-hh:mm:ss:cc で戻されるように指定します。 出力時刻形式引数として DELTA を指定する場合には,入力時刻引数に対してもデルタ時間を指定しなければなりません。
出力フィールド
次のいずれか 1 つ (短縮できません) を含む文字列式を指定します。 DATE,MONTH,DATETIME (省略時の設定),SECOND,DAY,TIME,HOUR,WEEKDAY, HUNDREDTH,YEAR,MINUTE,DAYOFYEAR,HOUROFYEAR,MINUTEOFYEAR,SECONDOFYEAR。情報は,出力時刻形式 引数に指定した時刻形式で戻されます。
入力時刻 引数がデルタ時間で, 出力時刻形式 引数が DELTA の場合は,MONTH,WEEKDAY,YEAR, DAYOFYEAR,HOUROFYEAR,MINUTEOFYEAR,または SECONDOFYEAR は指定できません。
曜日が戻される場合は,最初の文字は大文字でそれ以降の文字は小文字です。
F$CVTIME 関数を使用する場合,( 最後の引数の右に指定する ) オプションの引数は省略できますが,最後に指定する引数の左の引数を省略する場合は,コンマ (,) は省略できません。絶対時刻,または複合時刻形式で入力時刻引数を指定した場合は, 出力時刻形式 引数として ABSOLUTE や COMPARISON は指定できますが,DELTA は指定できません。
デルタ時間形式で 入力時刻引数を指定した場合は, 出力時刻形式 引数として DELTA を指定しなければなりません。
#1 |
---|
$ TIME = F$TIME() $ SHOW SYMBOL TIME TIME = "14-DEC-2002 10:56:23.10" $ TIME = F$CVTIME(TIME) $ SHOW SYMBOL TIME TIME = "2002-12-14 10:56:23.10" |
この例では F$TIME 関数を使用して,文字列としてシステム時刻を戻し,その時刻を TIME というシンボルに割り当てています。次に,F$CVTIME関数を使用して,システム時刻を別の時刻形式に変換しています。TIME はシンボルなので,この引数を引用符 (" ") で囲む必要はありません。レキシカル関数に対する引数としてシンボルが使用された時,シンボルは自動的に評価されます。
この結果,求められた文字列を使って,2 つの日付を比較できます (.LTS. 演算子と .GTS. 演算子を使用します )。たとえば,F$CVTIME を使用すれば,2 つの時刻文字列を変換し,その結果を TIME_1 と TIME_2 というシンボルに格納できます。そのあと,2 つの値を比較し,次に示されているように結果にもとづいてラベルに分岐させることができます。
$ IF TIME_1 .LTS. TIME_2 THEN GOTO FIRST
#2 |
---|
$ NEXT = F$CVTIME("TOMORROW",,"WEEKDAY") $ SHOW SYMBOL NEXT NEXT = "Tuesday" |
この例では,F$CVTIME 関数は "TOMORROW" という絶対時刻キーワードに対応する曜日を戻します。"TOMORROW" と "WEEKDAY" という引数は,引用符で囲まなければなりません。これらの引数は,文字列式だからです。また,省略する 出力時刻形式引数に対しては,省略したことを示すために,プレースホルダとしてコンマを指定しなければなりません。
#3 |
---|
$ SHOW TIME 27-MAR-2002 09:50:31 $ WRITE SYS$OUTPUT F$CVTIME(,,"DAYOFYEAR") 86 $ WRITE SYS$OUTPUT F$CVTIME(,,"HOUROFYEAR") 2049 $ WRITE SYS$OUTPUT F$CVTIME(,,"MINUTEOFYEAR") 122991 $ WRITE SYS$OUTPUT F$CVTIME(,,"SECONDOFYEAR") 7379476 |
この例では,F$CVTIME は次のようなキーワードの値を戻します。 DAYOFYEAR,HOUROFYEAR,MINUTEOFYEAR,SECONDOFYEAR。
前へ | 次へ | 目次 | 索引 |