在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?

Posted

技术标签:

【中文标题】在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?【英文标题】:in z/OS Assembler, can I read a JCL input stream twice? 【发布时间】:2020-02-26 13:43:40 【问题描述】:

有没有办法多次读取 z/OS JCL 输入流? (来自 //SYSIN DD *)。我知道我可以在第一次读取流时缓存它,然后从缓存的数据中读取,但我对那个解决方案不感兴趣。

注意:语言是汇编语言

【问题讨论】:

您使用哪种程序或计算机语言来读取 SYSIN?尝试关闭并重新打开文件流。 您可以从符合 LE 的汇编程序中调用 C 运行时例程。 【参考方案1】:

取决于语言。这个答案在 HLASM 中提供了一个示例,并在末尾提供了对“C”语言参考的参考。

对于 Assembler,当您使用 CLOSEDCB 时,您需要 REWIND。请参阅FINISH 的标签,了解这是如何完成的。

可能还有其他方法,但这在 z/OS 2.4 上对我有用

         PRINT NOGEN                                                     
* ------------------------------------------------------------------- *  
*                                                                     *  
*  SYSIN2                                                             *  
*                                                                     *  
*  @author Hogstrom                                                   *  
*                                                                     *  
*  Test to see if one can re-read SYSIN more than one time.           *  
*                                                                     *  
* ------------------------------------------------------------------- *  
R0       EQU   0                                                         
R1       EQU   1                                                         
R2       EQU   2                                                         
R3       EQU   3                 * Number of times to loop               
R4       EQU   4                                                         
R5       EQU   5                                                         
R6       EQU   6                                                         
R7       EQU   7                                                         
R8       EQU   8                                                         
R9       EQU   9                                                         
R10      EQU   10                                                        
R11      EQU   11                                                        
R12      EQU   12                * Base Register                         
R13      EQU   13                                                        
R14      EQU   14                                                        
R15      EQU   15                                                        
*                                                                        
SYSIN2   CSECT                                                           
         STM   R14,R12,12(R13)                                           
         LR    R12,R15                                                   
         USING SYSIN2,12                                                 
*                                                                        
         ST    R13,SaveArea+4                                            
         LA    R0,SaveArea                                               
         ST    R0,8(R13)                                                 
         LA    R13,SaveArea                                              
*                                                                        
         OPEN  (SYSIN,(INPUT))                                           
         OPEN  (SYSOUT,(OUTPUT))                                         
         LA    R3,3              Number of times to read SYSIN 
*                                                                        
GETAGAIN DS   0H                                                         
         GET   SYSIN,INREC       Read the next rec        
         PUT   SYSOUT,INREC      Write that bad boy out   
         B     GETAGAIN                                                  
FINISH   DS   0H                 Invoked at End of Data of SYSIN 
         CLOSE (SYSIN,REWIND)    Close SYSIN and rewind                                        
         OPEN  (SYSIN,(INPUT))   Open it up again 
         BCT   R3,GETAGAIN       Repeat the madness  
*                                                                        
         CLOSE SYSIN                                                     
         CLOSE SYSOUT                                                    
*
         L     R13,SaveArea+4                                           
         LM    R14,R12,12(R13)                                          
         XR    R15,R15                                                  
         BR    R14                                                      
 *                                                                       
 SYSIN    DCB   DSORG=PS,MACRF=(GM),DDNAME=SYSIN,EODAD=FINISH,          *
                RECFM=FB,LRECL=80,BLKSIZE=0                              
 SYSOUT   DCB   DSORG=PS,MACRF=(PM),DDNAME=SYSOUT,                      *
                RECFM=FBA,LRECL=133,BLKSIZE=0                            
 *                                                                       
 INREC          DC  CL132' '                                             
 SaveArea       DS  18F                                                  
                LTORG                                                    
          END                                                            

组装以上代码并执行这个JCL

//SYSIN2   JOB (CCCCCCCC),'HOGSTROM',                                         
//             MSGLEVEL=(1,1),                                                
//             MSGCLASS=O,                                                    
//             CLASS=A,                                                       
//             NOTIFY=&SYSUID                                                 
//*                                                                           
//STEP1  EXEC PGM=SYSIN2                                                      
//STEPLIB DD  DSN=USER1.TEST.LOADLIB,DISP=SHR                                 
//*                                                                           
//SYSIN  DD  *                                                                
 REC 1 OF 3                                                                   
 REC 2 OF 3                                                                   
 REC 3 OF 3                                                                   
/*                                                                            
//SYSOUT  DD  SYSOUT=*                                                        
//SYSUDUMP DD  SYSOUT=*                                                       

你会得到这个输出

您会看到相同的 SYSIN 数据重复了 3 次。

对于“C”程序,IBM 文档中C Compiler 的此参考提供了一些关于倒带的提示。

要打开流内数据集,请调用 fopen() 或 freopen() 库 函数并指定数据集的ddname。你可以开一个 流内数据集仅用于读取。指定任何更新, 写入或附加模式失败。 打开插播数据后 设置,您不能获取或更改文件位置,除非通过 倒带。 这意味着调用 fseek()、ftell()、fgetpos()、 流内数据集的 fsetpos() 失败。 调用 rewind() 导致 z/OS XL C/C++ 重新打开文件,将文件位置保留在 开始。

您正在寻找的是可能的,但实现取决于语言。

【讨论】:

我的应用,语言是 z/OS Assembler。 @FierceMonkey 添加了一个汇编示例 @Hogstrom 简洁明了的例子,谢谢!

以上是关于在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?的主要内容,如果未能解决你的问题,请参考以下文章

z/OS 如何调用 Web 服务? [关闭]

从 IBM Z/OS 获取日志

z/OS 中的 BPXBATCH 实用程序 - 执行 jar 文件

PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?

如何在 z/OS 上将 java 作为作业步骤运行

阻塞与非阻塞 I/O 缓冲?