在程序
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC
在B方案
EXEC CICS RETURN
END-EXEC
是否计划仅适用于b返回程序的通过COMMAREA? 或者它返回整个联合部?
在程序
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC
在B方案
EXEC CICS RETURN
END-EXEC
是否计划仅适用于b返回程序的通过COMMAREA? 或者它返回整个联合部?
方案B返回既不整个连杆部分,也不是COMMAREA(逗号在你的例子)。
它没有返回值。
为什么它没有什么回报? 因为没有东西传递给它。
或者说,什么被传递给它只是参数(S)的地址(ES)。 没有其他的。 就这些。 重要的是,没有长度。
OCCASION
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.
一个位的,东西是定义为只有一个字节。 这没有什么区别。 它的定义是,在连杆部分,在PROCEDURE DIVISION使用...相匹配的项目,在职权范围,没有别的秩序,给CALL ...使用...
PROGB会“通过”一个位的-东西的地址。 如果该地址,然后映射到调用程序的连接段100个字节,COBOL不介意。
如果我们改变调用示例,而不是使用一些-东西,因为有些-东西有相同的起始地址作为位的-的东西,就在生成的代码完全没有变化,而在的执行没有变化两个方案。
数据定义不同大小的来电者“之间”,并要求通常不这样做,因为它使事情不太清楚地告诉我们,人类。 编译器不关心一个小额。
你需要看看01S(或77S如果这愚蠢的想法需要你的想象)作为是重新定义。 他们是一个REDEFINES,一个隐含的一个,数据被定义在别处。 没有数据在连杆部分项目定义(有一个例外,即在大型机)。 在连接段01的水平只是重新定义,或映射,传递给该程序的数据的地址。 该数据不“离开”调用程序,数据永远不会“回传”。
事情都可能出错,当然,如果你使用不同长度匹配的USINGs项目。 如果从来电者是“后天”(如在CICS一个GETMAIN)存储,然后试图进一步在该存储以外的引用数据,甚至是一个字节,可以让你异常终止由于寻址异常(一S0C4,其CICS会亲切的名字东西给你,一个AKEA)。
即使没有收购了存储,其他领域的一前一后“通过”可小心删除,还是该领域本身可能无法获得预期的量的数据移动到它被调用的程序,如果定义为短期的调用程序。
实际上有其获得从节目叫“返回”两件事情。 他们是特殊寄存器RETURN-CODE,并在程序分流的返回单个项目(如果使用的话,可能不会)。
即便如此,如何将这些得以实现的机制是从数据的正常误解不同的主叫和被叫程序之间的“放行”。
我没有编程的CICS了一段时间,现在的快乐,这个答案是基于我还记得哪些知识。
调用程序获取至多小于或等于(或由可选的长度参数指定的)在调用程序发送的数据区的大小的数据量。 不要试图访问超出了您发送的数据。
“所以,如果在节目x链接到y编程,做Y中的COMMAREA任何更新将在X可见。” 来源: SOVF:如何CICS共享内存厂 。
“当一个通信区域由EXEC CICS LINK命令的方式通过,被调用的程序传递一个指针到通信区域本身。对于所述数据区的内容作出所调用的程序的任何修改都可以给调用程序,当控制返回到它;访问任何这样的变化,节目名是在原始COMMAREA选项所指定的数据区” 资料来源: IBM的CICS-参考 。
所以, does program b only return the commarea that program a passed?
我会回答上面的为是。
Does it return the whole linkage section?
至于这一个,这取决于链接程序的DFHCOMMAREA的结构。 如果它只含有1个这样的区域,那么答案是,它是从该地区(隐或显式)的链接命令返回发送的字节数。 请记住,这个区域是你的来电者之外。 所以,如果主叫方发送100个字节和联动部分具有500个字节的区域,你只能得到100回之最。
If you want to allow your linked program to modify data in the commarea, there are some very serious limitations.
Exec CICS
Return
End-Exec
Will expose a changes in a commarea to the LINKing program, but only by accident and only if both tasks execute on the same CICS region. This is because the commarea is actually a pointer. On a distributed program link, the area is copied, but not copied back.