整个联动段return?
Does the whole linkage section return?
在节目a中
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC
在程序b中
EXEC CICS RETURN
END-EXEC
程序b只有return程序a通过的逗号吗?还是 return 整个链接部分?
我已经有一段时间没有编程 CICS 的乐趣了,这个答案是基于我还记得的知识。
调用程序获取的数据量最多小于或等于调用程序中发送的数据区大小(或由可选的 LENGTH 参数指定)。不要尝试访问超出您已发送的数据。
"So if program x LINKS to program y, any updates done to the COMMAREA in y will be visible in x."
资料来源:SOVF:How CICS Shared Memory Works.
"When a communication area is passed by way of an EXEC CICS LINK command, the invoked program is passed a pointer to the communication area itself. Any changes that are made to the contents of the data area in the invoked program are available to the invoking program, when control returns to it; to access any such changes, the program names the data area that is specified in the original COMMAREA option." 来源:IBM-CICS-Ref.
所以,does program b only return the commarea that program a passed?
我会回答上面的问题。
Does it return the whole linkage section?
至于这个,要看linked程序的DFHCOMMAREA的结构。如果它只包含 1 个这样的区域,那么答案是它 returns 与从该区域发送的 link 命令一样多的字节(隐式或显式)。请记住,这个区域在您的来电者之外。因此,如果调用方发送 100 个字节,而 linkage 部分有 500 个字节的区域,那么您最多只能返回 100 个。
程序 B return既不是整个 LINKAGE SECTION 也不是逗号(在您的示例中是 COMMA)。
它return没什么。
为什么 return 什么都没有?因为没有任何东西传递给它。
或者更确切地说,传递给它的只是参数的地址。没有其他的。就这些。重要的是,没有长度。
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 中 PROCEDURE DIVISION USING ... 项目的定义,按引用顺序匹配 CALL ... USING ...
PROGB 将是 "passed" 一些东西的地址。如果该地址随后映射到被调用程序的 LINKAGE SECTION 中的 100 个字节,COBOL 根本不介意。
如果我们将 CALL 示例更改为使用 some-stuff,因为 some-stuff 与 a-bit-of-stuff 具有相同的起始地址,生成的代码绝对不会发生变化,也不会发生变化在两个程序的执行中。
定义不同大小的数据"between" CALLer 和 CALLed 通常不会完成,因为它让我们人类不太清楚。编译器一点都不关心。
您需要像重新定义一样查看 01 年代(或者 77 年代,如果您喜欢这个愚蠢的想法)。它们是在别处定义的数据的重新定义,隐式定义。没有为 LINKAGE SECTION 中的项目定义数据(在大型机上有 one 例外)。 LINKAGE SECTION 中的 01 层只是重新定义或映射传递给程序的数据的地址。数据不 "leave" CALLing 程序,数据从不 "passed back".
事情 可以 出错,当然,如果您使用不同的长度来匹配 USING 上的项目。如果来自 CALLer 的存储是 "acquired"(就像 CICS 中的 GETMAIN),那么尝试引用该存储之外的数据,即使再多一个字节,也会因为寻址异常(S0C4,它CICS 会很乐意为您命名一个 AKEA)。
即使没有获取存储空间,"passed" 之后的其他字段也可能被意外丢弃,或者字段本身可能无法获得 CALLed 程序向其移动的预期数据量,如果定义很短在调用的程序中。
实际上有两件事从 CALLed 程序中得到 "returned"。它们是特殊寄存器 RETURN-CODE,以及 PROCEDURE DIVISION 的 RETURNING 上的单个项目(如果使用,可能不会)。
即使如此,实现这些机制的机制也不同于 CALLing 和 CALLed 程序之间对数据的正常误解 "passed"。
如果要允许 linked 程序修改逗号区中的数据,则有一些非常严重的限制。
Exec CICS
Return
End-Exec
将向 LINKing 程序公开逗号中的更改,但这只是偶然发生的,并且仅当两个任务都在同一 CICS 区域上执行时。这是因为逗号实际上是一个指针。在分布式程序 link 上,区域被复制,但没有复制回来。
在节目a中
EXEC CICS LINK
PROGRAM(PGMB)
COMMAREA(COMMA)
LENGTH(LENGTH OF COMMA)
RESP(CICS-RESP)
END-EXEC
在程序b中
EXEC CICS RETURN
END-EXEC
程序b只有return程序a通过的逗号吗?还是 return 整个链接部分?
我已经有一段时间没有编程 CICS 的乐趣了,这个答案是基于我还记得的知识。
调用程序获取的数据量最多小于或等于调用程序中发送的数据区大小(或由可选的 LENGTH 参数指定)。不要尝试访问超出您已发送的数据。
"So if program x LINKS to program y, any updates done to the COMMAREA in y will be visible in x." 资料来源:SOVF:How CICS Shared Memory Works.
"When a communication area is passed by way of an EXEC CICS LINK command, the invoked program is passed a pointer to the communication area itself. Any changes that are made to the contents of the data area in the invoked program are available to the invoking program, when control returns to it; to access any such changes, the program names the data area that is specified in the original COMMAREA option." 来源:IBM-CICS-Ref.
所以,does program b only return the commarea that program a passed?
我会回答上面的问题。
Does it return the whole linkage section?
至于这个,要看linked程序的DFHCOMMAREA的结构。如果它只包含 1 个这样的区域,那么答案是它 returns 与从该区域发送的 link 命令一样多的字节(隐式或显式)。请记住,这个区域在您的来电者之外。因此,如果调用方发送 100 个字节,而 linkage 部分有 500 个字节的区域,那么您最多只能返回 100 个。
程序 B return既不是整个 LINKAGE SECTION 也不是逗号(在您的示例中是 COMMA)。
它return没什么。
为什么 return 什么都没有?因为没有任何东西传递给它。
或者更确切地说,传递给它的只是参数的地址。没有其他的。就这些。重要的是,没有长度。
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 中 PROCEDURE DIVISION USING ... 项目的定义,按引用顺序匹配 CALL ... USING ...
PROGB 将是 "passed" 一些东西的地址。如果该地址随后映射到被调用程序的 LINKAGE SECTION 中的 100 个字节,COBOL 根本不介意。
如果我们将 CALL 示例更改为使用 some-stuff,因为 some-stuff 与 a-bit-of-stuff 具有相同的起始地址,生成的代码绝对不会发生变化,也不会发生变化在两个程序的执行中。
定义不同大小的数据"between" CALLer 和 CALLed 通常不会完成,因为它让我们人类不太清楚。编译器一点都不关心。
您需要像重新定义一样查看 01 年代(或者 77 年代,如果您喜欢这个愚蠢的想法)。它们是在别处定义的数据的重新定义,隐式定义。没有为 LINKAGE SECTION 中的项目定义数据(在大型机上有 one 例外)。 LINKAGE SECTION 中的 01 层只是重新定义或映射传递给程序的数据的地址。数据不 "leave" CALLing 程序,数据从不 "passed back".
事情 可以 出错,当然,如果您使用不同的长度来匹配 USING 上的项目。如果来自 CALLer 的存储是 "acquired"(就像 CICS 中的 GETMAIN),那么尝试引用该存储之外的数据,即使再多一个字节,也会因为寻址异常(S0C4,它CICS 会很乐意为您命名一个 AKEA)。
即使没有获取存储空间,"passed" 之后的其他字段也可能被意外丢弃,或者字段本身可能无法获得 CALLed 程序向其移动的预期数据量,如果定义很短在调用的程序中。
实际上有两件事从 CALLed 程序中得到 "returned"。它们是特殊寄存器 RETURN-CODE,以及 PROCEDURE DIVISION 的 RETURNING 上的单个项目(如果使用,可能不会)。
即使如此,实现这些机制的机制也不同于 CALLing 和 CALLed 程序之间对数据的正常误解 "passed"。
如果要允许 linked 程序修改逗号区中的数据,则有一些非常严重的限制。
Exec CICS
Return
End-Exec
将向 LINKing 程序公开逗号中的更改,但这只是偶然发生的,并且仅当两个任务都在同一 CICS 区域上执行时。这是因为逗号实际上是一个指针。在分布式程序 link 上,区域被复制,但没有复制回来。