如何在SYSOUT头部显示当前程序运行所在的Load Library?
获取z/OS COBOL程序运行所在的Load Library方法
好问题!在z/OS COBOL环境里,要获取程序当前运行所在的Load Library,确实不像用WHEN-COMPILED拿编译时间那么直接,但有几种可靠的LE(Language Environment)原生方法可以实现,我给你详细说明:
方法一:使用LE服务例程CEELOCN
这是最直接的方式,CEELOCN是LE提供的服务,专门用于获取当前模块的加载位置信息,包括它所在的数据集(也就是Load Library)名称。
COBOL代码示例
IDENTIFICATION DIVISION. PROGRAM-ID. GET-LOAD-LIB. DATA DIVISION. WORKING-STORAGE SECTION. *> CEELOCN的参数结构,参考IBM文档定义 01 CEELOCN-PARM-BLOCK. 05 MODULE-NAME PIC X(8) VALUE LOW-VALUES. *> 传LOW-VALUES表示获取当前运行模块的信息 05 RC PIC S9(9) BINARY. 05 MODULE-ADDR POINTER. 05 LOAD-MODULE-NAME PIC X(8). 05 DATASET-NAME PIC X(44). *> z/OS数据集名最长44字符,刚好匹配 05 RESERVED-AREA PIC X(12) VALUE LOW-VALUES. 01 WS-CALL-RC PIC S9(9) BINARY. PROCEDURE DIVISION. CALL 'CEELOCN' USING CEELOCN-PARM-BLOCK GIVING WS-CALL-RC. IF WS-CALL-RC = 0 THEN DISPLAY '当前程序所在Load Library: ' FUNCTION TRIM(DATASET-NAME) ELSE DISPLAY '获取Load Library失败,返回码: ' WS-CALL-RC END-IF. STOP RUN.
关键说明
- 当你给
MODULE-NAME传LOW-VALUES时,CEELOCN会自动返回当前正在运行的模块的信息。 - 返回的
DATASET-NAME字段会包含完整的Load Library数据集名称,比如USER.LOADLIB或者SYS1.LINKLIB,你可以直接把它加到SYSOUT头部里。 - 这个方法支持所有LE环境下的COBOL程序,不管是主程序还是被调用的子程序,也能正确识别从LPA、MLPA等系统链接库加载的模块。
方法二:非LE环境的备选方案(极少用到)
如果你的程序是老的非LE COBOL程序(现在这种情况非常少见),可以通过调用系统宏LOADxx或者解析CAA(Common Anchor Area)来获取,但实现起来复杂很多,而且兼容性差。建议优先使用CEELOCN,因为现在z/OS上的COBOL程序基本都是基于LE运行的。
补充提示
- 你可以把获取Load Library的逻辑和已经实现的
WHEN-COMPILED逻辑整合到SYSOUT头部输出里,比如:DISPLAY '程序名称: ' PROGRAM-NAME DISPLAY '编译时间: ' WHEN-COMPILED DISPLAY '运行Load库: ' FUNCTION TRIM(DATASET-NAME) - 注意
DATASET-NAME是固定44字节,输出时记得用FUNCTION TRIM去掉末尾的空格,让SYSOUT显示更整洁。
内容的提问来源于stack exchange,提问作者SaggingRufus
相关产品推荐
相关产品推荐

