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

第六十七章 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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342