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

Fie*_*key 2 input jcl zos

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

注:语言为汇编语言

Hog*_*rom 7

取决于语言。该答案提供了 HLASM 中的示例,并在最后提供了对“C”语言参考的引用。

对于汇编程序,REWIND当您CLOSE使用DCB. 请参阅 处的标签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                                                            
Run Code Online (Sandbox Code Playgroud)

组装以上内容并执行此 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=*                                                       
Run Code Online (Sandbox Code Playgroud)

你会得到这个输出

SYSIN2 作业输出

您将看到相同的 SYSIN 数据重复三次。

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

要打开流内数据集,请调用 fopen() 或 freopen() 库函数并指定数据集的 ddname。您只能打开流内数据集进行读取。指定任何更新、写入或追加模式都会失败。打开流内数据集后,除了倒带之外,您无法获取或更改文件位置。这意味着对流内数据集的 fseek()、ftell()、fgetpos() 和 fsetpos() 的调用失败。调用 rewind() 会导致 z/OS XL C/C++ 重新打开文件,将文件位置保留在开头。

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