前へ | 次へ | 目次 | 索引 |
WRITE コマンドを使用すると,文字列をレコードに書き込むことができます。レコード内のカラムをそろえるには,F$FAO 関数を使用してレコード・フィールドを定義し,これらのフィールドにプロセス名とユーザ名を格納します。F$FAO 関数を使用する場合には,制御文字列を使用してレコード内のフィールドを定義します。その後,これらのフィールドに格納する値を指定します。
レコード内のフィールドを書式化する別の方法として,文字列オーバレイを使用する方法があります。しかし,F$FAO 関数の方が文字列オーバレイより強力です。F$FAO 関数を使用すると,広範囲にわたる出力操作を実行できます。
この例に示したコマンド・プロシージャでは,WRITE コマンドを使用して,システムのプロセスのプロセス名と PID 番号を表示します。
$ ! Initialize context symbol to get PID numbers $ CONTEXT = "" $ ! Write headings $ WRITE SYS$OUTPUT "Process Name PID" $ ! $ GET_PID: $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ WRITE SYS$OUTPUT F$GETJPI(PID,"PRCNAM")," ", F$GETJPI(PID,"PID") $ GOTO GET_PID |
次に示すように,WRITE コマンドからの出力では,プロセス名とユーザ名の間に 5 つのスペースが挿入されますが,桁そろえは行われません。
Process Name PID MARCHESAND 2CA0049C TRACTMEN 2CA0043A FALLON 2CA0043C ODONNELL 2CA00453 PERRIN 2CA004DE CHAMPIONS 2CA004E3 |
この例の中では,コマンド・プロシージャは,F$FAO 関数を使用して,16 文字フィールドと 12 文字フィールドを定義しています。F$FAO 関数は,最初のフィールドにプロセス名を収めてから,スペースはスキップして,2 番目のフィールドに PID を収めます。
$ ! Initialize context symbol to get PID numbers $ CONTEXT = "" $ ! Write headings $ WRITE SYS$OUTPUT "Process Name PID" $ ! $ GET_PID: $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ LINE = F$FAO("!16AS !12AS", F$GETJPI(PID,"PRCNAM"), F$GETJPI(PID,"PID")) $ WRITE SYS$OUTPUT LINE $ GOTO GET_PID |
ここで,プロシージャを実行すると,桁がそろえられます。
Process Name PID MARCHESAND 2CA0049C TRACTMEN 2CA0043A FALLON 2CA0043C ODONNELL 2CA00453 PERRIN 2CA004DE CHAMPIONS 2CA004E3 |
次の例は,オーバレイを使用して,RECORD シンボルの最初の 16 文字(オフセット 0 から始まる)にプロセス名を収め,次の 12 文字(オフセット 17 から始まる)に PID を収めます。
$ ! Initialize context symbol to get PID numbers $ CONTEXT = "" $ ! Write headings $ WRITE SYS$OUTPUT "Process Name PID" $ ! $ GET_PID: $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ RECORD[0,16]:= 'F$GETJPI(PID,"PRCNAM")' $ RECORD[17,12]:= 'F$GETJPI(PID,"PID")' $ WRITE SYS$OUTPUT RECORD $ GOTO GET_PID |
このプロシージャでは,F$FAO 関数で作成したのと同じ書式が生成されます。
Process Name PID MARCHESAND 2CA0049C TRACTMEN 2CA0043A FALLON 2CA0043C ODONNELL 2CA00453 PERRIN 2CA004DE CHAMPIONS 2CA004E3 |
データを文字列から整数に,整数から文字列に変換するには,次のレキシカル関数を使用します。
F$CVSI | 文字列からビット・フィールドを取り出して,符号付きの値である結果を整数に変換する。 |
F$CVUI | 文字列からビット・フィールドを取り出して,符号なしの値である結果を整数に変換する。 |
F$INTEGER | 文字列式を整数に変換する。 |
F$STRING | 整数式を文字列に変換する。 |
F$TYPE | シンボルのデータ・タイプを判別する。 |
整数と文字列の間で変換を行うには,F$INTEGER 関数と F$STRING 関数を使用します。たとえば,次のコマンド・プロシージャはデータ・タイプを変換します。ユーザが文字列を入力すると整数の同値が表示され,整数を入力すると文字列の同値が表示されます。GOTO 文の中でラベル名を使用するときには,F$TYPE 関数をどのように使用したらよいかに注意してください。F$TYPE は,シンボルのデータ・タイプに応じて,"STRING" または "INTEGER" を戻します。
$ IF P1 .EQS. "" THEN INQUIRE P1 "Value to be converted" $ GOTO CONVERT_'F$TYPE(P1)' $ $ CONVERT_STRING: $ WRITE SYS$OUTPUT "The string ''P1' is converted to ''F$INTEGER(P1)'" $ EXIT $ $ CONVERT_INTEGER: $ WRITE SYS$OUTPUT "The integer ''P1' is converted to ''F$STRING(P1)'" $ EXIT |
INQUIRE や READ などのコマンドは,文字列データしか受け付けません。これらのコマンドを使用して,整数式として評価したいデータを得るには,F$INTEGER 関数を使用してこのデータを変換してから評価します。
EXP シンボルを F$INTEGER 関数の引数として使用する場合には,EXP シンボルの前後に一重引用符(')を置かなければなりません。こうすると,シンボル置換の最初のフェーズで EXP の値が置換されます。
次の例では,F$INTEGER 関数を使用して,整数式を評価します。
$ INQUIRE EXP "Enter integer expression" $ RES = F$INTEGER('EXP') $ WRITE SYS$OUTPUT "Result is",RES |
このコマンド・プロシージャからの出力は次のようになります。
Enter integer expression: 9 + 7 Result is 16 |
"9 + 7" の値が置換されます。F$INTEGER 関数が引数の "9 + 7" を処理する場合,式を評価して正しい結果を戻します。
15.7.3 シンボルの有無の判別
シンボルが存在するかどうかを判別するには,F$TYPE 関数を使用します。F$TYPE 関数は,シンボルが未定義であると,空の文字列を戻します。
. . . $ IF F$TYPE(TEMP).EQS. "" THEN TEMP = "YES" $ IF TEMP .EQS. "YES" THEN GOTO TEMP_SEC . . . |
このプロシージャは,TEMP シンボルが前に定義されているかどうかをテストします。定義済みの場合には,TEMP の正しい値が保持され,TEMP が定義されていない場合には,IF 文により "YES" の値が TEMP に割り当てられます。
プロセスとは,システムとの会話を可能にするために,OpenVMS オペレーティング・システムで作成される環境です。プロセスには,独立プロセス(他のプロセスから独立しているプロセス)と サブプロセス(別のプロセスに従属して存在し,資源を得ているプロセス)があります。メイン・プロセスは親プロセスとも呼ばれ,独立プロセスの 1 つです。本章では,次のことについて説明します。
ユーザが次のいずれかのタスクを実行すると,システムはプロセスを作成します。
システムはユーザがログインするごとにそのユーザ用にプロセスを作成する。
システムはバッチ・ジョブを受け取るとそのジョブ用にプロセスを作成する。バッチ・ジョブが完了すると,システムはプロセスを削除する。
ユーザが SPAWN コマンドを使用すると,システムはプロセスを作成する。
/DETACHED 修飾子または /UIC=uic 修飾子を使用してプログラムを実行すると,システムはプロセスを作成する。
特権,シンボル,論理名などプロセスが使用する属性を,プロセス・コンテキストといいます。システムは,プロセス固有の特性を ユーザ登録ファイル(UAF) から取得します。UAF は,システムへのアクセスを許可されたユーザをリストして,それぞれのユーザのプロセスの特性を定義します。通常,UAF の管理はシステム管理者が行います。システムは一度に 1 つずつプログラム(イメージまたは実行可能イメージとも呼ばれる)を実行しますが,これらのプログラムはプロセスと呼ばれる環境内で実行されます。
現在のプロセスのプロセス・コンテキストを表示するには,SHOW PROCESS/ALL コマンドを使用します。
次の例は,プロセス・コンテキストのサンプルです。
11-DEC-2002 13:30:37.12 (1) User: CLEAVER (2) Process ID: 24E003DC (3) Node: ZEUS Process name: "CLEAVER" (4) Terminal: VTA2195: TNA2170: (Host: 16.32.123.45 Port: 6789) (5) User Identifier: [DOC,CLEAVER] (6) Base priority: 4 (7) Default file spec: DISK1:[CLEAVER] (8) Number of Kthreads: 1 Devices allocated: ALPHAI$VTA2195: Process Quotas: (9) Account name: DOC CPU limit: Infinite Direct I/O limit: 1024 Buffered I/O byte count quota: 119616 Buffered I/O limit: 1024 Timer queue entry quota: 400 Open file quota: 299 Paging file quota: 100080 Subprocess quota: 30 Default page fault cluster: 64 AST quota: 798 Enqueue quota: 5000 Shared file limit: 0 Max detached processes: 0 Max active jobs: 0 Accounting information: (10) Buffered I/O count: 16424 Peak working set size: 13920 Direct I/O count: 12014 Peak virtual size: 185392 Page faults: 11113 Mounted volumes: 0 Images activated: 68 Elapsed CPU time: 0 00:04:18.55 Connect time: 0 00:08:22.76 Authorized privileges: NETMBX TMPMBX Process privileges: (11) GROUP may affect other processes in same group TMPMBX may create temporary mailbox OPER operator privilege NETMBX may create network device Process rights: (12) CLEAVER resource INTERACTIVE LOCAL System rights: SYS$NODE_ZEUS Auto-unshelve: on Image Dump: off Soft CPU Affinity: off Parse Style: Traditional Home RAD: 0 Scheduling class name: none Process Dynamic Memory Area (13) Current Size(Kb) 128.00 Current Size(Pagelets) 256 Free Space(Kb) 111.18 Space in Use(Kb) 16.81 Largest Var Block(Kb) 109.69 Smallest Var Block(bytes) 8 Number of Free Blocks 10 Free Blocks LEQU 64 Bytes 4 There is 1 process in this job: (14) CLEAVER(*) |
SHOW PROCESS/ALL コマンドを実行した日時。
プロセスに関連するアカウントに割り当てられたユーザ名。
システムによってプロセスに割り当てられた固有の番号。SHOW PROCESS コマンドは,PID を 16 進数で表示する。
プロセスに割り当てられた名前。プロセス名は一意であるため,あるアカウントでログインした最初のプロセスにはユーザ名が割り当てられ,同じアカウントでログインしたそれ以降のプロセスにはターミナル名が割り当てられる。プロセス名は,DCL の SET PROCESS/NAME コマンドで変更できる。
プロセスに関連するアカウントに割り当てられたグループとメンバの番号または文字(たとえば,[PERSONNEL,RODGERS])。UIC により,ユーザが属するグループが分かる。同じグループに属するユーザ同士は,他のグループのユーザとの間より自由にファイルやシステム資源を共用できる。
プロセスの現在の優先順位。
現在のデバイスとディレクトリ。現在の省略時の値は,DCL の SET DEFAULT コマンドによって変更することができる。
プロセスに関連するクォータ(上限)。クォータは,SHOW PROCESS コマンドに /QUOTAS または /ALL 修飾子を付けて実行することにより確認することができる。
プロセスのメモリの使用状況と CPU 時間に関する情報。この情報は,時々刻々と更新されており,SHOW PROCESS コマンドに /ACCOUNTING または /ALL 修飾子を付けて実行することにより,最新の情報を得ることができる。
プロセスに付与された特権。特権は,特定のシステム・アクティビティを特定のユーザしか実行できないように制限する。特権は,SHOW PROCESS コマンドに /PRIVILEGES または /ALL 修飾子を付けて実行することにより確認することができる。
アクセス制御リスト(ACL)保護と一緒に使用されるシステムが定義する識別子。識別子は,ACL の中でユーザを指定する手段である。ACL は,ファイル,デバイス,メールボックスなどのオブジェクトのユーザに許容または拒否されるアクセスの種類を定義するセキュリティ・ツール。
プロセスの現在の動的メモリの使用状況。動的メモリは,イメージが実行されるときにシステムによってそのイメージに割り当てられる。プロセスがそのメモリを必要としなくなった場合には,システムはそれを別のプロセスに割り当てる。この情報は,SHOW PROCESS コマンドに /MEMORY または /ALL 修飾子を付けて実行することにより得られる。
親プロセスに属するサブプロセスのリスト。現在のプロセスはその末尾にアスタリスク(*)が付けられる。このリストは,SHOW PROCESS コマンドに /SUBPROCESSES または /ALL 修飾子を付けて実行することにより得られる。
独立プロセスは,親プロセスの種類にしたがって,会話型または非会話型のいずれかになります。DCL の RUN コマンドまたは Create Process システム・サービス($CREPRC)にユーザが指定する引数に応じて,ユーザまたは OpenVMS オペレーティング・システムがログインを行います。RUN も $CREPRC も SYS$SYSTEM で LOGINOUT.EXE イメージを実行します。
16.3 サブプロセスの使用
SPAWN コマンドを使用すると,現在のプロセスのサブプロセスを作成できます。このサブプロセスの中で,ユーザはシステムと会話して,サブプロセスからログアウトして親プロセスに戻ったり,親プロセスとサブプロセスを切り替えたりできます。一度に 1 つのプロセスしか実行できません。
システム上のそれぞれのユーザは,ジョブ階層構造 によって表現されます。ジョブ階層構造とは,メイン・プロセスを頂点とし,それに属するすべてのプロセスとサブプロセスからなる階層をいいます。サブプロセスは親プロセスに従属し,親プロセスが終了すると削除されます。省略時の設定では,サブプロセスは,親プロセスの名前の後にアンダスコアと固有の番号を付けた名前を持ちます。たとえば,親プロセス名が DOUGLASS の場合,サブプロセスには DOUGLASS_1,DOUGLASS_2 というような名前が付けられます。
16.3.1 Spawn タスクによるサブプロセスの使用
タスクに割り込み,2 番目のタスクを実行してから,元のタスクに戻るには,Ctrl/Y を使用してタスクに割り込んだ後,2 番目のタスクを実行するサブプロセスを生成し,そのサブプロセスを終了してから,CONTINUE コマンドを入力して元のタスクに戻ります。省略時の設定では,ユーザがサブプロセスを作成すると,親プロセスはハイバネート状態になり,サブプロセスの中で DCL レベルでユーザに制御が渡されます。省略時のディレクトリは親プロセスの現在のディレクトリである。たとえば,Ctrl/Y を押して EVE 編集セッションに割り込んだ場合には,CONTINUE コマンドを入力してから Ctrl/W を押して画面を再表示します。
16.3.2 サブプロセスの使用による複数のタスクの実行
最初のタスクの実行を続けながら,2 番目のタスクを実行するには,SPAWN/NOWAIT コマンドでサブプロセスを作成します。SPAWN/NOWAITは,非会話型のバッチに似たサブプロセスを生成し,入力を必要としないコマンドを実行するときにだけ使用します。
親プロセスとサブプロセスの両方が同時に実行されるため,双方がターミナルを制御しようとします。混乱が生じるのを避けるため,次の修飾子やパラメータも指定してください。
サブプロセスが,ターミナルではなく,指定されたファイルに出力を書き込むように指定する。
サブプロセスが,ターミナルから入力を読み込むのではなく,指定されたコマンドを実行するように指定する。
SPAWN コマンドの /INPUT 修飾子を指定すると,サブプロセスは非会話型のプロセスとして生成され,重大エラーまたはファイルの終端を検出すると終了します。DCL レベルでは,Ctrl/Z がファイルの終端標識として扱われます。
前へ | 次へ | 目次 | 索引 |