zl程序教程

您现在的位置是:首页 >  其它

当前栏目

第六十七章 Caché 函数大全 $VIEW 函数

函数 大全 View Cach
2023-09-11 14:15:37 时间

第六十七章 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时,不指定长度整数值。

要以相反顺序返回字节值(最低地址处的低位字节),请在长度值后附加字母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 }

在上面的示例中,$VIEWLENGTH参数是“3O”(3和字母O)。在BIG-Endian系统上运行时,它以相反的顺序(O)指定接下来三(3)个字节的长度。因此,$VIEW从内存中的一个位置(视图缓冲区-由模式0表示)开始,并返回最高字节、第二高字节和第三高字节。

在小端系统中,字母“O”是无操作符。长度值“3O”与长度值“3”相同。

可以使用IsBigEndian()类方法来确定操作系统平台上使用的位顺序:1=大端位序;0=小端位序。

DHC-APP> WRITE $SYSTEM.Version.IsBigEndian()
0