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


前へ 次へ 目次 索引


15.6.3 出力文字列の書式化

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 

15.7 データ・タイプの処理

データを文字列から整数に,整数から文字列に変換するには,次のレキシカル関数を使用します。

F$CVSI 文字列からビット・フィールドを取り出して,符号付きの値である結果を整数に変換する。
F$CVUI 文字列からビット・フィールドを取り出して,符号なしの値である結果を整数に変換する。
F$INTEGER 文字列式を整数に変換する。
F$STRING 整数式を文字列に変換する。
F$TYPE シンボルのデータ・タイプを判別する。

15.7.1 データ・タイプの変換

整数と文字列の間で変換を行うには,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 

15.7.2 式の評価

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 に割り当てられます。


第 16 章
プロセスとバッチ・ジョブ

プロセスとは,システムとの会話を可能にするために,OpenVMS オペレーティング・システムで作成される環境です。プロセスには,独立プロセス(他のプロセスから独立しているプロセス)と サブプロセス(別のプロセスに従属して存在し,資源を得ているプロセス)があります。メイン・プロセスは親プロセスとも呼ばれ,独立プロセスの 1 つです。本章では,次のことについて説明します。

プロセスの作成方法

ユーザが次のいずれかのタスクを実行すると,システムはプロセスを作成します。

16.1 プロセス・コンテキストへの割り込み

特権,シンボル,論理名などプロセスが使用する属性を,プロセス・コンテキストといいます。システムは,プロセス固有の特性を ユーザ登録ファイル(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(*)
 

例を確認するときは,次のことに注意してください。

  1. 現在の日時

    SHOW PROCESS/ALL コマンドを実行した日時。

  2. ユーザ名

    プロセスに関連するアカウントに割り当てられたユーザ名。

  3. プロセス識別番号(PID)

    システムによってプロセスに割り当てられた固有の番号。SHOW PROCESS コマンドは,PID を 16 進数で表示する。

  4. プロセス名

    プロセスに割り当てられた名前。プロセス名は一意であるため,あるアカウントでログインした最初のプロセスにはユーザ名が割り当てられ,同じアカウントでログインしたそれ以降のプロセスにはターミナル名が割り当てられる。プロセス名は,DCL の SET PROCESS/NAME コマンドで変更できる。

  5. ユーザ識別コード(UIC)

    プロセスに関連するアカウントに割り当てられたグループとメンバの番号または文字(たとえば,[PERSONNEL,RODGERS])。UIC により,ユーザが属するグループが分かる。同じグループに属するユーザ同士は,他のグループのユーザとの間より自由にファイルやシステム資源を共用できる。

  6. 優先順位

    プロセスの現在の優先順位。

  7. 省略時のファイル指定

    現在のデバイスとディレクトリ。現在の省略時の値は,DCL の SET DEFAULT コマンドによって変更することができる。

  8. プロセス・クォータ

    プロセスに関連するクォータ(上限)。クォータは,SHOW PROCESS コマンドに /QUOTAS または /ALL 修飾子を付けて実行することにより確認することができる。

  9. 会計情報

    プロセスのメモリの使用状況と CPU 時間に関する情報。この情報は,時々刻々と更新されており,SHOW PROCESS コマンドに /ACCOUNTING または /ALL 修飾子を付けて実行することにより,最新の情報を得ることができる。

  10. プロセス特権

    プロセスに付与された特権。特権は,特定のシステム・アクティビティを特定のユーザしか実行できないように制限する。特権は,SHOW PROCESS コマンドに /PRIVILEGES または /ALL 修飾子を付けて実行することにより確認することができる。

  11. プロセス・ライト

    アクセス制御リスト(ACL)保護と一緒に使用されるシステムが定義する識別子。識別子は,ACL の中でユーザを指定する手段である。ACL は,ファイル,デバイス,メールボックスなどのオブジェクトのユーザに許容または拒否されるアクセスの種類を定義するセキュリティ・ツール。

  12. プロセスの動的メモリ空間

    プロセスの現在の動的メモリの使用状況。動的メモリは,イメージが実行されるときにシステムによってそのイメージに割り当てられる。プロセスがそのメモリを必要としなくなった場合には,システムはそれを別のプロセスに割り当てる。この情報は,SHOW PROCESS コマンドに /MEMORY または /ALL 修飾子を付けて実行することにより得られる。

  13. 階層構造の中のプロセス

    親プロセスに属するサブプロセスのリスト。現在のプロセスはその末尾にアスタリスク(*)が付けられる。このリストは,SHOW PROCESS コマンドに /SUBPROCESSES または /ALL 修飾子を付けて実行することにより得られる。

16.2 独立プロセスの使用

独立プロセスは,親プロセスの種類にしたがって,会話型または非会話型のいずれかになります。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 がファイルの終端標識として扱われます。


前へ 次へ 目次 索引