AS400 COBOL中EXIT PROGRAM被CLP调用时未退出问题咨询
AS400 COBOL程序EXIT PROGRAM在CLP调用时无法正常退出的原因分析
问题描述
编写了名为PGM2的AS400 COBOL程序,程序内000-MAIN SECTION的090-EXIT段落使用EXIT PROGRAM语句,预期执行后返回调用程序,但后续200-WRITE-LINE SECTION的代码仍在运行。经测试,当调用程序为COBOL程序时EXIT PROGRAM可正常退出,但若调用程序为CLP(控制语言程序)则无法正常退出。
程序代码
IDENTIFICATION DIVISION. PROGRAM-ID. PGM2. / ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-AS400. OBJECT-COMPUTER. IBM-AS400. / DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VARS PIC X(10). / PROCEDURE DIVISION. 000-MAIN SECTION. ****************** 010-START. * INITIALIZE WS-VARS. * 090-EXIT. EXIT PROGRAM. / 200-WRITE-LINE SECTION. ************************ 210-START. * DISPLAY 'STILL RUNNING'. * 290-EXIT. EXIT. /
原因分析
- 语句行为差异:
EXIT PROGRAM是COBOL规范中专门用于嵌套COBOL程序调用的返回语句,仅在被另一个COBOL程序调用时,会直接将控制权返回给上级COBOL程序,终止当前程序的执行流程。 - CLP调用的运行时特性:当COBOL程序被CLP调用时,AS400的COBOL运行时环境将其视为独立启动的程序,
EXIT PROGRAM仅完成“退出调用上下文”的标记,但不会终止整个程序的执行,程序会继续执行PROCEDURE DIVISION中后续定义的SECTION代码。 - 执行流程逻辑:你的程序中
000-MAIN SECTION执行完EXIT PROGRAM后,没有任何语句阻止程序继续执行后续的200-WRITE-LINE SECTION,因此在CLP调用场景下会出现后续代码运行的情况。
解决方案
若需要在CLP调用时也能完全终止程序,应使用STOP RUN语句替代EXIT PROGRAM。STOP RUN会直接终止整个COBOL程序的执行,无论调用者是CLP还是其他COBOL程序,都会立即返回调用环境,后续代码不会被执行。
修改后的090-EXIT段落代码:
090-EXIT. STOP RUN.
内容的提问来源于stack exchange,提问作者Mr. Tacio
相关产品推荐
相关产品推荐

