在程序中
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC
在程序b中
EXEC CICS RETURN
END-EXEC
程序b是否只返回程序传递的commarea?或者它是否返回整个LINKAGE SECTION?
答案 0 :(得分:4)
程序B既不返回整个LINKAGE SECTION,也不返回逗号(在您的示例中为COMMA)。
它什么都不返回。
为什么没有返回?因为什么都没有传递给它。
或者更确切地说,传递给它的只是参数的地址。没有其他的。就这些。重要的是,没有长度。
PROGA
01 some-stuff.
05 a-bit-of-stuff PIC X.
05 the-rest-of-the-stuff PIC X(99).
CALL .... USING a-bit-of-stuff
PROGB
LINKAGE SECTION.
01 stuff-that-is-somewhere-else PIC X(100).
PROCEDURE DIVISION USING stuff-that-is-somewhere-else.
a-bit-of-stuff定义为只有一个字节。这没什么区别。在LINKAGE SECTION中,关于程序划分使用的项目的定义......按照参考顺序,与CALL匹配......使用......
PROGB将被通过"一点点的地址。如果该地址随后映射到CALLed程序的LINKAGE SECTION中的100个字节,则COBOL根本不介意。
如果我们改变那个示例CALL而不是使用某些东西,因为某些东西具有与a-bit-of-stuff相同的起始地址,所以生成的代码绝对没有变化,并且没有变化执行这两个程序。
定义不同大小的数据"在"之间CALLer和CALLed通常都没有完成,因为它让人们对我们不太清楚。编译器不关心一个。
你需要看看01s(或77s,如果这个愚蠢的想法取悦你的想法)和REDEFINES一样。它们是REDEFINES,一种隐含的数据,在其他地方定义。没有为LINKAGE SECTION中的项目定义数据(大型机上有一个例外)。 LINKAGE SECTION中的01级只是重新定义或映射传递给程序的数据的地址。数据没有"离开" CALLing程序,数据永远不会被传回"。
当然,如果您使用不同的长度来匹配USING上的项目,那么 会出错。如果来自CALLer的存储被"获得" (就像CICS中的GETMAIN一样)然后尝试引用该存储之外的数据,甚至更远的一个字节,由于寻址异常(S0C4,CICS将为您指定其他东西,一个AKEA),可能会让您异常终止即使没有获得存储空间,也可以在其他字段之后通过"可能会被意外删除,或者如果CALLed程序中的定义很短,则字段本身可能无法通过CALLed程序获得预期的数据量。
实际上有两件事情会被退回"来自CALLed计划。它们是特殊寄存器RETURN-CODE,以及程序部分RETURNING上的单项(如果使用的话,可能不是)。
即便如此,实现这些目标的机制也不同于对数据的正常误解和#34;通过" CALLing和CALLed程序之间。
答案 1 :(得分:2)
我现在有一段时间没有编程CICS的乐趣,这个答案是基于我还记得的知识。
调用程序最多获得的数据量小于或等于调用程序中发送的数据区域的大小(或者由可选的LENGTH参数指定)。不要试图访问超出您发送的数据。
“因此,如果程序x LINKS编程为y,则在y中可以看到对y中的COMMAREA所做的任何更新。” 来源:SOVF:How CICS Shared Memory Works。
“当通过EXEC CICS LINK命令传递通信区域时,调用的程序将传递指向通信区域本身的指针。对调用程序中数据区域内容所做的任何更改都是可用的当控制返回到调用程序时;要访问任何此类更改,程序将命名原始COMMAREA选项中指定的数据区域。“来源:IBM-CICS-Ref。
所以,does program b only return the commarea that program a passed?
我会回答上述情况。
Does it return the whole linkage section?
至于这个,它取决于链接程序的DFHCOMMAREA的结构。如果它只包含1个这样的区域,那么答案是它返回的字节数是从该区域的链接命令发送的字节数(隐式或显式)。请记住,此区域位于呼叫者之外。因此,如果调用者发送100个字节并且链接部分的区域为500字节,那么最多只能返回100个字节。
答案 2 :(得分:0)
如果您希望允许链接的程序修改commarea中的数据,则存在一些非常严重的限制。
Exec CICS
Return
End-Exec
将commarea中的更改公开给LINKing程序,但只是偶然且仅当两个任务在同一个CICS区域上执行时才会发生。这是因为commarea实际上是一个指针。在分布式程序链接上,该区域被复制,但不会被复制回来。