2015-01-20 40 views
1

在程序整個聯動部分是否返回?

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部分?

回答

4

程序B既不返回整個LINKAGE SECTION也不返回commarea(在你的例子中是COMMA)。

它什麼都沒有返回。

爲什麼它不返回?因爲沒有任何東西被傳遞給它。

或者,傳遞給它的僅僅是參數的地址(s)。沒有其他的。就這些。重要的是,沒有長度。

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. 

一個比特的-東西是定義爲只有一個字節。這沒有什麼區別。這是定義,在鏈接部分的程序部分使用...,其中沒有別的順序匹配的調用...使用...

PROGB將「通過「一點東西的地址。如果該地址在CALLed程序的LINKAGE SECTION中映射到100個字節,COBOL完全不介意。

如果我們將該示例CALL改爲使用某些東西,因爲某些東西具有與東西相同的起始地址,那麼在生成的代碼中絕對不會有任何更改,兩個程序的執行。

定義CALLer和CALLed之間的不同大小的數據通常不會被完成,因爲它使得我們對人類不那麼清楚。編譯器不關心一個記錄。

你需要看看01s(或77s如果這個愚蠢的想法帶你看中),就像REDEFINES一樣。它們是在其他地方定義的數據的REDEFINES,一個隱含的數據。沒有爲LINKAGE SECTION中的項目定義數據(一個例外於主機)。 LINKAGE SECTION中的01級只是重新定義或映射傳遞給程序的數據的地址。數據不會「離開」CALLing程序,並且數據永遠不會「傳回」。

東西可以出錯了,當然,如果您使用不同的長度來匹配USING上的項目。如果來自CALLer的存儲是「已獲取」的(就像CICS中的GETMAIN),那麼嘗試引用該存儲之外的數據(甚至還有一個字節)會由於尋址異常(S0C4,CICS將請爲你命名別的東西,一個AKEA)。

即使沒有獲得存儲空間,其中一個「通過」後的其他字段也可能被意外刪除,或者如果CALLed中的定義較短,則該字段本身可能無法獲得CALLed程序MOVEd預期的數據量程序。

實際上有兩件事情從CALLed程序中「返回」。它們是特殊註冊表的RETURN-CODE,並且是RETURNING PROCEDURE DIVISION(如果使用,可能不是)的單個項目。即使如此,如何實現這些機制的機制也不同於對CALLing和CALLed程序之間「通過」數據的正常誤解。

2

我現在還沒有喜歡編程CICS,這個答案是基於我還記得的知識。

調用程序獲取的最大數據量小於或等於調用程序中發送的數據區域的大小(或者由可選的LENGTH參數指定)。不要嘗試訪問超出您發送的數據。

「所以如果程序x LINKS編程y,則對y中的COMMAREA所做的任何更新都將在x中可見。」 來源: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個。

+0

除了兩個引號之外,你需要在這方面做一些工作。 – 2015-01-20 22:57:28

0

如果您希望允許鏈接的程序修改commarea中的數據,則存在一些非常嚴重的限制。

Exec CICS 
    Return 
End-Exec 

會暴露在COMMAREA到鏈接程序的變化,只是偶然且僅當這兩個任務執行同一CICS區域。這是因爲commarea實際上是一個指針。在分佈式程序鏈接上,該區域被複制,但不會被複制回來。

+0

Doah,你說得對,我很困惑我的工具。對於那個很抱歉。 – 2015-01-21 19:02:40