1

在程序 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 传递的逗号区域?还是返回整个链接部分?

4

3 回答 3

4

程序 B 既不返回整个 LINKAGE SECTION 也不返回 commarea(在您的示例中为 COMMA)。

它什么也不返回。

为什么什么都不返回?因为没有任何东西传递给它。

或者,更确切地说,传递给它的只是参数的地址。没有其他的。就这些。重要的是,没有长度。

普罗加

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

程序

LINKAGE SECTION.

01  stuff-that-is-somewhere-else PIC X(100).
PROCEDURE DIVISION USING stuff-that-is-somewhere-else.

a-bit-of-stuff 仅定义为一个字节。这没什么区别。它是 PROCEDURE DIVISION USING ... 在 LINKAGE SECTION 中的项目的定义,按照参考顺序,它与 CALL ... USING ... 匹配,仅此而已

PROGB 将被“传递”一些东西的地址。如果该地址随后映射到被调用程序的 LINKAGE SECTION 中的 100 个字节,COBOL 根本不介意。

如果我们将示例 CALL 更改为使用 some-stuff,因为 some-stuff 与 a-bit-of-stuff 具有相同的起始地址,生成的代码绝对不会发生变化,并且在执行两个程序。

通常不会在“CALLer”和“CALLed”之间定义不同大小的数据,因为它使我们人类不太清楚。编译器一点也不在乎。

你需要看看 01 年代(或者 77 年代,如果你喜欢这个愚蠢的想法),就像 REDEFINES 一样。它们是在其他地方定义的数据的重新定义,隐含的数据。LINKAGE SECTION 中的项目没有定义数据(在大型机上有一个例外)。LINKAGE SECTION 中的 01 级只是重新定义或映射传递给程序的数据的地址。数据不会“离开” CALLing 程序,并且数据永远不会“传回”。

当然,如果您使用不同的长度来匹配 USING 上的项目,事情可能会出错。如果来自 CALLer 的存储被“获取”(如 CICS 中的GETMAIN),那么尝试引用该存储之外的数据,即使是一个字节,也会由于寻址异常(S0C4,CICS 将请为您命名其他名称,一个 AKEA)。

即使没有获得存储,“通过”之后的其他字段也可能被意外丢弃,或者如果 CALLed 程序中的定义很短,则字段本身可能无法获得 CALLed 程序向其移动的预期数据量。

实际上有两件事可以从 CALLed 程序中“返回”。它们是专用寄存器 RETURN-CODE,以及 PROCEDURE DIVISION 的 RETURNING 上的单个项目(如果使用,可能不会)。

即便如此,实现这些的机制与对 CALLing 和 CALLed 程序之间“传递”数据的正常误解不同。

于 2015-01-20T22:55:40.617 回答
2

我已经有一段时间没有编程 CICS 的乐趣了,这个答案是基于我还记得的知识。

调用程序获得的数据量最多小于或等于调用程序中发送的数据区域的大小(或由可选的 LENGTH 参数指定)。不要试图访问超出您发送的数据的数据。

“因此,如果将 x LINKS 编程为 y,则对 y 中的 COMMAREA 所做的任何更新都将在 x 中可见。” 资料来源:SOVF:CICS 共享内存的工作原理

“当通过 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 个字节。

于 2015-01-20T21:23:52.590 回答
0

如果你想让你的链接程序修改commarea中的数据,有一些非常严重的限制。

Exec CICS
   Return 
End-Exec

会将逗号中的更改暴露给 LINKing 程序,但这只是偶然的,并且只有在两个任务都在同一个 CICS 区域上执行的情况下。这是因为逗号实际上是一个指针。在分布式程序链接上,该区域被复制,但不被复制回来。

于 2015-01-21T17:08:13.960 回答