第六十七章 Caché 函数大全 $VIEW 函数
返回内存位置的内容。
大纲
$VIEW(offset,mode,length)
$V(offset,mode,length)
参数
- offset 正整数:与mode指定的内存区域中的基址之间的偏移量(以字节为单位)。解释与模式有关(请参见下文)。-1:返回过程摘要信息的标志。
- mode 可选-基地址将用于定位数据的内存区域。默认值为-1。
- length 可选-要返回的数据长度,以字节为单位。也可以包含字母
“O”
的逆序后缀。默认值为1。返回流程摘要信息时,返回值格式标志:1 =插入符分隔的字符串(默认值)
;2 = $list
结构的字符串。
描述
$VIEW返回内存位置的内容。
视图缓冲区是一个特殊的存储区,用于存储使用VIEW
命令从Caché数据库(CACHE.DAT)读取的数据块。将一个块读入视图缓冲区后,可以在模式0下使用$VIEW
函数检查视图缓冲区的内容。必须打开视图缓冲区作为设备63才能访问它。完成后,应关闭设备63。
也可以使用$VIEW
返回过程摘要信息。
$VIEW
函数通常在调试和修复Caché数据库和系统信息时使用。
参数
offset
该参数的值取决于mode参数,如下所示:
- 当mode为0,-1或-2时,请指定一个正整数作为与基址的偏移量,以字节为单位,从0开始计数。
- 当mode为-3或正整数时,请在进程地址空间中指定一个地址。值-1可用于检索过程状态的摘要。
- 当mode为-5时,请指定一个正整数,该整数指定当前块中的全局节点数。在这种情况下,奇数值返回完整的全局引用,而偶数值返回指针或数据。
mode
下表显示了mode的可能值。如果省略mode,则默认值为-1。请注意,某些值是特定于实现的。表中列出了实施限制。
Mode | 内存管理区域 | 基址 |
---|---|---|
0 | 视图缓冲区 | 视图缓冲区的开始 |
-1 | 进程的分区(默认) | 分区开始 |
-2 | 系统表 | 系统表的开头 |
-3 | 当前进程的地址空间。 | 0 |
-5 | 全局变量引用和数据 | 特殊 |
-6 | 保留供系统间使用 | |
-7 | 仅由完整性检查实用程序使用 | 特殊 |
n | 当n为正数时,表示正在运行的进程n的地址空间,其中n是该进程的pid($JOB特殊变量的值)。将偏移量和长度与模式-3相同。 | 0 |
length
长度(以字节为单位)或标志字符。解释取决于模式和偏移值:
- 当mode为0,-1或-2,-3或正整数(一个pid),而offset为正整数时,length参数可以为:
- 从-1到最大字符串长度的负整数(作为负整数),以字符串形式返回该长度的数据。
$VIEW
从offset指示的地址开始返回指定数量的字符。 - 1到8(含)之间的一个正整数,用于返回数据的十进制值。
$VIEW
从偏移量指示的地址开始,从一到四个连续字节或八个连续字节返回。 - 字母C或P作为带引号的字符串,表示在32位系统上为四字节地址,在64位系统上为八字节地址。指定C或P时,不指定长度整数值。
- 从-1到最大字符串长度的负整数(作为负整数),以字符串形式返回该长度的数据。
要以相反顺序返回字节值(最低地址处的低位字节),请在长度值后附加字母O后缀,并将结果字符串括在双引号中。
如果省略length参数,则默认值为1。
- 当mode为-3或正整数(pid),且offset为-1时,length参数是一个标志,用于指定摘要信息的格式。指定长度1可以将该摘要作为定界字符串返回,或者指定2可以将该摘要作为
$LIST
结构返回。如果省略length参数,则默认值为1。 - 当mode为-5时,请勿指定长度参数。
注意
$VIEW
使用限制
$VIEW
功能是受限制的系统功能。这是受保护的命令,因为调用的代码位于CACHESYS数据库中。
进程摘要信息
当offset为-1时,可以使用模式-3从当前进程地址空间以^分隔的字符串返回摘要信息,如以下示例所示:
DHC-APP>WRITE $VIEW(-1,-3,1)
12156^*^|TRM|:|12156*,^124^e:\dthealth\db\dthis\data\^^4675,792^8^0,0^^131072^^^DHC-APP^1^16384,5^252^%All^%All
还可以返回与$LIST
结构相同的信息,如下所示:
DHC-APP>zw $VIEW(-1,-3,2)
$lb(12156,"*","|TRM|:|12156*,",124,"e:\dthealth\db\dthis\data\","","4675,792",8,"0,0","",131072,"","","DHC-APP",1,"16384,5",252,"%All","%All")
要从指定进程的地址空间返回摘要信息,请提供该进程的进程ID
(pid)作为mode参数的正整数,如下例所示:
DHC-APP>SET pid=$PIECE($IO,"|",4)
DHC-APP>WRITE $VIEW(-1,pid,1)
12156^*^|TRM|:|12156*,^130^e:\dthealth\db\dthis\data\^^5134,794^8^0,0^^131072^^^DHC-APP^1^16384,5^252^%All^%All
以下终端示例在dev字段中返回多个当前打开的设备。它首先只返回当前进程。然后,它打开一个假脱机设备(设备2),并将打开的设备作为逗号分隔的列表返回:
DHC-APP>WRITE $VIEW(-1,-3)
12156^*^|TRM|:|12156*,^130^e:\dthealth\db\dthis\data\^^5134,794^8^0,0^^131072^^^DHC-APP^1^16384,5^252^%All^%All
DHC-APP>OPEN 2:(3:12)
DHC-APP>WRITE $VIEW(-1,-3)
12156^*^|TRM|:|12156*,2,^132^e:\dthealth\db\dthis\data\^^5134,795^8^0,0^^131072^^^DHC-APP^1^16384,5^252^%All^%All
WRITE $VIEW(-1,-3)
7788^^|TCP|1972|7788*,//./nul,^560^e:\dthealth\db\dthis\data\^%Studio.General.1^7508683,732966^8^0,0^^131072^^^DHC-APP^1^16384,2^1824^%All^%All
OPEN 2:(3:12)
WRITE $VIEW(-1,-3)
7788^^|TCP|1972|7788*,//./nul,2,^562^e:\dthealth\db\dthis\data\^%Studio.General.1^7522978,733491^8^0,0^^131072^^^DHC-APP^1^16384,2^1824^%All^%All
摘要信息返回值采用以下格式:
pid^mode^dev^mem^dir^rou^stat^prio^uic^loc^blk^^^defns^lic^jbstat^mempeak^roles^loginroles
字段定义如下:
字段 | 描述 |
---|---|
pid | 进程ID 。请参见SYS.Process 类的Pid 属性。 |
mode |
* 如果在终端提示符下进入。+ 或- (如果作业是呼叫连接的一部分)。对于后台进程省略。 |
dev | 当前打开的设备,以逗号分隔的列表形式返回。当前设备($IO 设备)以星号(* )后缀表示。请参阅SYS.Process 类的OpenDevices 属性。请注意,dev值包含结尾逗号,而OpenDevices值不包含逗号。 |
mem | 如果进程不是守护程序,则该进程分区中正在使用的内存(以KB为单位)。与SYS.Process 类的MemoryUsed 属性相似但不相同。 |
dir | 默认目录 |
rou | 例程名称 |
stat | 逗号分隔的一对整数计数bol,gcnt,其中bol是行令牌的开始,指定了执行的行数,gcnt是全局计数,指定了执行的FOR 循环和XECUTE 命令的总数。 |
prio | 用户当前的基本优先级。请参见SYS.Process 类的Priority 属性。 |
uic | 已过时,默认为0,0。 |
loc | 位置,仅适用于守护进程。 |
blk | 可用伴数据块队列的2K数据块数。这是用户内存空间(也称为分区空间)的最大大小。请参见SYS.Process 类的MemoryAllocated 属性。 |
defns | 默认名称空间。请参见SYS.Process 类的NameSpace 属性。 |
lic | 许可证位 |
jbstat | 作业状态,指定为高,低,代表高位和低位。有关详细信息,请参见$ZJOB 特殊变量。 |
mempeak | 该进程的峰值内存使用量,以千字节为单位。该值近似于最接近的64K。请参见SYS.Process 类的MemoryPeak 属性。 |
roles | 进程当前具有的角色以逗号分隔的列表形式返回。与$ROLES 值相同。请参见SYS.Process 类的Roles 属性。 |
loginroles | 流程启动时所具有的角色,以逗号分隔的列表形式返回。请参阅SYS.Process 类的LoginRoles 属性。 |
使用模式-5
如果视图缓冲区中的当前块包含全局的一部分,则将mode指定为-5会返回全局引用和该块中包含的值。长度参数对于-5模式无效。
在模式为-5的情况下,偏移值指定块中的全局节点数,而不是距基地址的字节偏移量。奇数值返回完整的全局引用,偶数值返回指针或数据。
例如,若要返回视图缓冲区中第n
个节点的完整全局引用,请指定n*2-1
作为偏移量。要返回第n
个节点的值,请指定n*2
。要返回块中最后一个节点的全局引用,请指定-1作为偏移值。lue返回完整的全局引用,偶数值返回指针或数据。
$VIEW
按排序顺序(即数字)返回节点。这与$ORDER
函数使用的序列相同。通过编写预期此序列的代码,可以通过视图缓冲区中的全局快速执行顺序扫描。(有几个Caché实用程序使用这种技术。)如果偏移量指定了视图缓冲区中最后一个节点之外的位置,$VIEW
将返回空字符串(“”
)。请确保在代码中包含对该值的测试。
如果当前块是指针块,则返回的值是缓存块编号,即指针。如果块是数据块,则返回的值是与节点关联的数据值。
如果$VIEW
发出<database>
或<function>
错误,则意味着块中的信息既不是有效的全局引用,也不是有效的数据。
下面的示例显示用于检查视图缓冲区内容的通用代码。代码首先打开视图缓冲区,并提示输入要读入的块的编号。然后,for
循环循环遍历当前块中的所有偏移。$VIEW
函数使用-5模式返回每个偏移量的值。WRITE
命令输出产生的偏移值对。
当到达块的末尾时,$VIEW
返回一个空字符串(“”
)。If
命令测试此值并写出“End of block”
消息。然后,QUIT
命令终止循环,控制返回到提示符,以便用户可以读入另一个块。
Start5 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 Start5+2
CLOSE 63
QUIT
对于全局块,此例程产生的典型输出可能如下所示:
DHC-APP>d Start5^PHA.TEST.Command
Opening view buffer.
Number of block to read in: 50
Offset = 1
Value = ^ROUTINE
Offset = 2
Value =
End of block: 50
Number of block to read in: 40
Offset = 1
Value = ^oddDEPTemp20101126("User.DHCEQDisuseRequestList",3)
Offset = 2
Value = 410472
Offset = 3
Value = ^oddDEPTemp20101126("User.DHCEQFunds",2,"%s")
Offset = 4
Value = 410473
Offset = 5
Value = ^oddDEPTemp20101126("User.DHCEQInvoice",7,"%Library.T")
Offset = 6
Value = 410474
Offset = 7
Value = ^oddDEPTemp20101126("User.DHCEQMonthDepre",7)
Offset = 8
Value = 410475
Offset = 9
Value = ^oddDEPTemp20101126("User.DHCEQOuterMaintRequest",5)
Offset = 10
Value = 410476
Offset = 11
逆序字节值(仅限大端)
在BIG-Endian系统上,通过使用字母“O”
后缀作为LENGTH
参数的一部分,可以以相反的顺序返回字节值。当指定字母O
的长度时,$VIEW
将以相反的顺序返回字节值。(长度值必须用双引号括起来。)。下面的示例显示了这一点:
USE IO
FOR Z=0:0 {
WRITE *-6
SET NEXTBN=$VIEW(LINKA,0,"3O")
QUIT:NEXTBN=0 }
在上面的示例中,$VIEW
的LENGTH
参数是“3O”
(3和字母O)。在BIG-Endian系统上运行时,它以相反的顺序(O)指定接下来三(3)个字节的长度。因此,$VIEW
从内存中的一个位置(视图缓冲区-由模式0表示)开始,并返回最高字节、第二高字节和第三高字节。
在小端系统中,字母“O”
是无操作符。长度值“3O”
与长度值“3”
相同。
可以使用IsBigEndian()
类方法来确定操作系统平台上使用的位顺序:1=大端位序;0=小端位序。
DHC-APP> WRITE $SYSTEM.Version.IsBigEndian()
0