在程序a中
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC在程序b中
EXEC CICS RETURN
END-EXEC程序b只返回程序a通过的逗区吗?还是返回整个链接部分?
发布于 2015-01-20 22:55:40
程序B既不返回整个链接部分,也不返回逗号区域(在您的示例中为逗号)。
它什么也不回。
为什么它什么也不回?因为什么都不会传递给它。
或者,传递给它的只是参数的地址(Es)。没别的了。这就是全部。重要的是没有长度。
孕产
01 some-stuff.
05 a-bit-of-stuff PIC X.
05 the-rest-of-the-stuff PIC X(99).
CALL .... USING a-bit-of-stuffPROGB
LINKAGE SECTION.
01 stuff-that-is-somewhere-else PIC X(100).
PROCEDURE DIVISION USING stuff-that-is-somewhere-else.一个字节被定义为一个字节.这没什么区别。它是在链接部分中使用.的程序划分项的定义。按参照顺序,没有其他的,与电话相符.用..。
PROGB将被“传递”一些东西的地址。如果该地址被映射到CALLed程序的链接部分中的100个字节,那么COBOL根本不介意。
如果我们把这个例子调用改为使用一些东西,因为一些东西的起始地址和一些东西一样,生成的代码绝对不会改变,两个程序的执行也不会改变。
在CALLer和CALLed之间定义不同大小的数据通常是没有完成的,因为它使我们人类不太清楚。编译器一点也不关心。
你需要看的是01(或者77,如果这个愚蠢的想法让你喜欢的话),因为它是重新定义的。它们是对其他地方定义的数据的重新定义,是一个隐含的数据。没有为链接部分中的项定义数据(主机上有一个例外)。链接部分中的01层只是重新定义或映射传递给程序的数据的地址。数据不会“离开”CALLing程序,数据永远不会“传回”。
当然,如果您使用不同的长度来匹配使用项,事情可能会出错。如果来自CALLer的存储是“获取”的(就像CICS中的GETMAIN ),那么尝试引用该存储之外的数据,即使在更远的一个字节上,也会因为寻址异常( S0C4,CICS将为您命名其他东西,AKEA)而获得一个abend。
即使没有已获得的存储,“传递”后的其他字段也可能会被意外破坏,或者如果定义在MOVEd程序中,则字段本身可能无法通过CALLed程序获得预期的数据量CALLed。
实际上,有两件事可以从CALLed程序中得到“返回”。它们是特殊寄存器返回代码,以及返回过程分区的单个项(如果使用,可能不会)。
即使如此,这些实现的机制与CALLing和CALLed程序之间对数据“传递”的正常误解有所不同。
发布于 2015-01-20 21:23:52
我已经有一段时间没有编程CICS的joy了,这个答案是基于我至今还记得的知识。
调用程序最多获得小于或等于在调用程序中发送的数据区域大小的数据量(或按可选长度参数指定的)。不要试图访问已发送的数据以外的数据。
因此,如果程序x LINKS对y编程,则在y中对COMMAREA所做的任何更新都将在x中可见。资料来源:SOVF: CICS共享内存的工作方式.
“当通过EXEC CICS链接命令传递通信区域时,被调用的程序被传递到通信区域本身的指针。当控制返回到调用程序时,对被调用程序中数据区域的内容所做的任何更改都可用于调用程序;要访问任何此类更改,程序将命名原始COMMAREA选项中指定的数据区域。”资料来源:参考文献.
所以,does program b only return the commarea that program a passed?
我会以“是”来回答上述问题。
Does it return the whole linkage section?对于这个问题,它取决于链接程序的DFHCOMMAREA的结构。如果它只包含一个这样的区域,那么答案是它返回来自该区域的链接命令发送的字节数(隐式或显式)。记住,这个区域在你的来电者之外。因此,如果调用方发送100个字节,而链接部分的区域为500个字节,则最多只能得到100个字节。
发布于 2015-01-21 17:08:13
如果希望允许链接程序修改逗区中的数据,则存在一些非常严重的限制。
Exec CICS
Return
End-Exec将向LINKing程序公开公共区域中的更改,但仅在两个任务在同一个CICS区域上执行时才是偶然的。这是因为逗号区域实际上是一个指针。在分布式程序链接上,复制该区域,但不复制回。
https://stackoverflow.com/questions/28054806
复制相似问题