$VIEW (ObjectScript)
構文
$VIEW(offset,mode,length)
$V(offset,mode,length)
引数
引数 | 説明 |
---|---|
offset |
正の整数:バイト単位で表される、mode で指定されたメモリ領域内のベース・アドレスからのオフセット。解釈はモードに依存します (以下を参照)。 -1:プロセス要約情報を返すフラグ。 |
mode | オプション — ベース・アドレスがデータを位置決めするのに使用されるメモリ領域。既定値は -1 です。 |
length |
オプション — Caché で返されるデータ長 (単位はバイト)。文字 “O” 逆順序の接頭語が含まれる場合もあります。既定値は 1 です。 プロセス要約情報を返す場合の戻り値の形式のフラグ:1 = キャレット区切りの文字列 (既定)、2 = $list 構造の文字列。 |
説明
$VIEW は、メモリ位置のコンテンツを返します。
表示バッファは、VIEW コマンドを使用して InterSystems IRIS データベース (IRIS.DAT) から読み取るデータ・ブロックを格納するために使用される特殊メモリ領域です。ブロックを表示バッファに読み取った後、mode 0 と共に $VIEW 関数を使用して、表示バッファのコンテンツを検査できます。表示バッファにアクセスするには、デバイス 63 として開く必要があります。完了したら、デバイス 63 を閉じます。
$VIEW を使用してプロセスの要約情報を返すこともできます。
通常、$VIEW 関数は、InterSystems IRIS データベースとシステム情報のデバッグと修復を行うときに使用されます。
引数
offset
この引数の値は、mode 引数の値に応じて指定します。以下は、その説明です。
-
mode が 0、-1、または -2 のときは、ベース・アドレスからのオフセットとして、0 から始まる正の整数をバイト単位で指定します。
-
mode が -3 または正の整数のときは、プロセスのアドレス空間内のアドレスを指定します。値 -1 を使用すると、下記の "プロセス要約情報" の説明に従って、プロセス状態の要約を取得できます。
-
mode が -5 のときは、現行ブロック内のグローバル・ノード数を指定する正の整数を指定します。この場合、奇数値はグローバル参照全体を返し、偶数値はポインタまたはデータを返します。
mode
mode で利用可能な値は、以下のとおりです。mode が省略されたときの既定値は -1 です。値の中には実装固有なものもあります。実装制限は以下の表に示します。
モード | メモリ管理領域 | ベース・アドレス |
---|---|---|
0 | 表示バッファ | 表示バッファの開始位置 |
-1 | プロセスのパーティション (既定) | パーティションの開始位置 |
-2 | システム・テーブル | システム・テーブルの開始位置 |
-3 | 現行プロセスのアドレス空間 | 0 |
-5 | グローバル参照とデータ | 特殊。"モード -5 の使用法" を参照。 |
-6 | インターシステムズ用に確保 | |
-7 | 整合性の確認ユーティリティによってのみ使用 | 特殊。 |
n | n が正の数のときは、実行中のプロセス n のアドレス空間。ここで n はそのプロセスの pid ($JOB 特殊変数の値) です。offset および length は mode -3 と同様に扱われます。 | 0 |
length
長さ (バイト単位)、またはフラグ文字。解釈は mode および offset の値によって決定します。
-
mode が 0、-1、または -2、-3、または正の整数 (pid) で、offset が正の整数の場合は、length 引数は以下のようになります。
-
データの長さを文字列で返す、-1 ~ 最大長の負の整数。$VIEW は、offset によって示されるアドレスで始まる、指定した文字数を返します。
-
1 ~ 8 の正の整数は、データの小数値を返します。$VIEW は、1 ~ 4 の連続したバイトか、offset によって示されるアドレスで始まる連続した 8 バイトを返します。
-
引用符で囲んだ文字列の 文字 C または P は、32 ビット・システム上の 4 バイト・アドレス、または 64 ビット・システム上の 8 バイト・アドレスを示します。C または P を指定する場合は、整数値の length は指定しません。
逆順でバイト値を返す (下位バイトを最下位アドレスに置く) には、文字 O を length 値に追加し、結果の文字列を二重引用符で囲みます。
length 引数が省略された場合、既定値は 1 です。
-
-
mode が -3 または正の整数 (pid) で offset が -1のときは、length 引数は要約情報の形式を指定するフラグです。length に 1 を指定すると、この要約を区切り文字で返し、2 を指定するとこの要約を $LIST 構造として返します。length 引数が省略された場合、既定値は 1 です。
-
mode が -5 のときは、length 引数は指定しないでください。
VIEW の使用の制限
$VIEW 関数は、制限付きのシステム機能です。呼び出されるコードが IRISSYS データベース内にあるので、コマンドは保護されます。詳細は、"特別な機能" を参照してください。
プロセス要約情報
offset が -1 の場合、以下の例に示すように mode -3 を使用して、現在のプロセスのアドレス空間から要約情報を ^ 区切り文字として返すことができます。
WRITE $VIEW(-1,-3,1)
以下のように同じ情報を $LIST 構造として返すことができます。
SET infolist = $VIEW(-1,-3,2)
ZWRITE infolist
指定されたプロセスのアドレス空間から要約情報を返すには、以下の例に示すようにそのプロセスのプロセス ID (pid) を mode 引数の正の整数として指定します。
SET pid=$PIECE($IO,"|",4)
WRITE $VIEW(-1,pid,1)
以下のターミナルの例は、dev フィールドの現在開いているデバイスを複数返します。これは、最初に現在のプロセスのみを返します。続いてスプール・デバイス (デバイス 2) を開き、開いているデバイスをコンマ区切りリストとして返します。
USER>WRITE $VIEW(-1,-3)
8484^*^|TRM|:|8484*,^116^...
USER>OPEN 2:(3:12)
USER>WRITE $VIEW(-1,-3)
8484^*^|TRM|:|8484*,2,^118^...
要約情報の返り値は、以下の形式で返されます。
pid^mode^dev^mem^dir^rou^stat^prio^uic^loc^blk^^^defns^lic^jbstat^mempeak^roles^loginroles
フィールドは以下のように定義されます。
フィールド | 説明 |
---|---|
pid | プロセス ID。クラス SYS.ProcessOpens in a new tab の PidOpens in a new tab プロパティを参照してください。 |
mode | ターミナル・プロンプトで実行する場合、*。ジョブがコールイン接続の一部である場合、+ または –。デーモンの場合は省略されます。 |
dev | コンマ区切りリストとして返される現在の開いているデバイス。現在のデバイス ($IO デバイス) はアスタリスク (*) 接尾語によって示されます。SYS.ProcessOpens in a new tab クラスの OpenDevicesOpens in a new tab プロパティを参照してください。dev の値には末尾のコンマが含まれ、OpenDevices の値には含まれないことに注意してください。 |
mem | プロセスがデーモンでない場合は、プロセスのパーティション内で使用されているメモリ量 (KB 単位)。SYS.ProcessOpens in a new tab クラスの MemoryUsedOpens in a new tab プロパティに似ていますが、同一ではありません。 |
dir | 既定のディレクトリ。 |
rou | ルーチン名。 |
stat | コンマ区切りの整数のカウントのペア bol,gcnt。bol は行の先頭を示すトークンで、実行される行数を指定します。gcnt はグローバル・カウントで、FOR ループと XECUTES コマンドの実行回数の合計を指定します。 |
prio | ユーザの現在のベース優先度。SYS.ProcessOpens in a new tab クラスの PriorityOpens in a new tab プロパティを参照してください。 |
uic | 廃止されました。既定は 0,0。 |
loc | 位置。デーモン・プロセスのみ。 |
blk | バディ・ブロック・キューに使用可能な 2K ブロックの数。これは、ユーザ・メモリ領域 (パーティション領域とも呼ばれる) の最大サイズです。SYS.ProcessOpens in a new tab クラスの MemoryAllocatedOpens in a new tab プロパティを参照してください。 |
defns | 既定のネームスペース。SYS.ProcessOpens in a new tab クラスの NameSpaceOpens in a new tab プロパティを参照してください。 |
lic | ライセンス・ビット。 |
jbstat | ジョブのステータス。上位ビットと下位ビットを表す high,low として指定されます。詳細は、"$ZJOB" 特殊変数を参照してください。 |
mempeak | プロセスのピーク・メモリ使用量 (キロバイト)。この値は、約 64K です。SYS.ProcessOpens in a new tab クラスの MemoryPeakOpens in a new tab プロパティを参照してください。 |
roles | プロセスが現在持っているロール。コンマ区切りリストとして返されます。$ROLES の値と同じです。 SYS.ProcessOpens in a new tab クラスの RolesOpens in a new tab プロパティを参照してください。 |
loginroles | プロセスが開始時に現在持っていたロール。コンマ区切りリストとして返されます。SYS.ProcessOpens in a new tab クラスの LoginRolesOpens in a new tab プロパティを参照してください。 |
モード -5 の使用法
表示バッファの現在のブロックにグローバルの一部が含まれている場合、mode に -5 を指定すると、グローバル参照とブロックに含まれている値が返されます。length 引数は、mode -5 では有効ではありません。
-5 の mode を使用した場合、offset 値は、ベース・アドレスのバイト・オフセットではなく、ブロックにあるグローバル・ノードを指定します。奇数値は、グローバル参照全体を返し、偶数値はポインタあるいはデータを返します。
例えば、表示バッファの n 番目のノードのグローバル参照全体を返すには、offset に n*2-1 を指定します。n 番目のノードの値を返すには、n *2 を指定します。ブロックの最終ノードのグローバル参照を返すには、offset に -1 を指定します。
$VIEW は、照合順 (つまり数値) でノードを返します。これは $ORDER 関数が使用するものと同じ順序です。この順序を想定したコードを記述することにより、表示バッファでグローバルを使用してすばやく順次スキャンを実行できるようになります (ObjectScript ユーティリティの一部は、この方法を使用します)。$VIEW は、offset が表示バッファの最後のノードを過ぎて位置を指定するとき、NULL 文字列 ("") を返します。コードの中にこの値についてのテストを含むようにしてください。
現在のブロックがポインタ・ブロックのときは、返り値はポインタである InterSystems IRIS ブロック数です。ブロックがデータ・ブロックのときは、返り値はノードに対応したデータ値です。
現在のブロックがデータ・ブロックで、$VIEW から <VALUE OUT OF RANGE> エラーが返される場合、そのオフセット位置に格納されている情報が長すぎる文字列であることを意味しています。そのオフセット位置に格納されているデータを取得するには、エラーをトラップし、その前のオフセット位置に格納されているグローバル参照を基準とした間接指定による $GET を使用します。例えば、x = $VIEW(offset, -5) の代わりに、x = $GET(@$VIEW(offset-1,-5)) を使用します。
$VIEW が <DATABASE> エラーもしくは <FUNCTION> エラーを出した場合は、ブロックでの情報は有効なグローバル参照でも有効なデータでもないという意味になります。
以下の例は、表示バッファのコンテンツを検査するための、汎用コードを示しています。コードは最初に表示バッファを開いてから、読み取るためのブロック数を入力できるようにします。FOR ループは、現在のブロックすべてのオフセットを繰り返します。$VIEW 関数は、-5 のモードを使用して、各オフセットで値を返します。WRITE コマンドは、結果の 1 組みのオフセット値を出力します。
ブロックの最後まで行くと、$VIEW は NULL 文字列 ("") を返します。IF コマンドは、この値をテストをして、“End of block” メッセージを書き込みます。その後、QUIT コマンドは、ループを終了して制御をプロンプトに戻し、ユーザが他のブロックで読み取りできるようにします。
Start OPEN 63
WRITE !,"Opening view buffer."
READ !!,"Number of block to read in: ",block QUIT:block=""
VIEW block
FOR i=1:1 {
SET x=$VIEW(i,-5)
IF x="",i#2 {
WRITE !!,"End of block: ",block
QUIT }
WRITE !,"Offset = ",i
WRITE !,"Value = ",x
}
GOTO Start+2
CLOSE 63
QUIT
グローバル・ブロックについて、通常このルーチンによって作成される出力は、以下のとおりです。
Opening view buffer. Number of block to read in:3720 Offset = 1 Value = ^client(5) Offset = 2 Value = John Jones Offset = 3 Value = ^client(5,1) Offset = 4 Value = 23 Bay Rd./Boston/MA 02049 . . . Offset = 126 Value = ^client(18,1,1) Offset = 127 Value = Checking/45673/1248.00 End of block: 3720 Number of block to read in:
逆の順序のバイト値 (ビッグ・エンディアンのみ)
ビッグ・エンディアン・システムでは、length 引数の一部として文字 “O” 接尾語を使用することにより、逆順序でバイト値を返すことができます。length に文字 O を含めて指定すると、$VIEW は逆順序でバイト値を返します (length は二重引用符で囲まなければなりません)。詳細は、以下の例を参照してください。
USE IO
FOR Z=0:0 {
WRITE *-6
SET NEXTBN=$VIEW(LINKA,0,"3O")
QUIT:NEXTBN=0 }
前述の例では、$VIEW の length 引数は "3O" です (3 と 文字 O)。ビッグ・エンディアン・システムで実行される場合、これは、逆の順序 (O) の次の 3 バイト (3) の長さを示しています。そのため、$VIEW はメモリにある位置 (表示バッファ — 0 の mode で示されるように) で開始し、最上位バイト、2 番目の上位バイト、および 3 番目の上位バイトを返します。
リトル・エンディアン・システムでは、文字 “O” は空命令です。“3O” の length 値は、“3” の length 値と同じです。
IsBigEndian()Opens in a new tab クラス・メソッドを使用して、オペレーティング・システム・プラットフォームでどのビット順序を使用するかを決定できます (1 = ビッグ・エンディアン・ビット順、0 = リトル・エンディアン・ビット順)。
WRITE $SYSTEM.Version.IsBigEndian()