в z / OS Assembler можно ли дважды прочитать поток ввода JCL? - PullRequest
2 голосов
/ 26 февраля 2020

Есть ли способ прочитать входной поток JCL az / OS более одного раза? (тот, который приходит от // SYSIN DD *). Я знаю, что могу кэшировать поток при первом чтении, а затем читать из кэшированных данных, но меня это решение не интересует.

Примечание: язык Ассемблер

1 Ответ

3 голосов
/ 26 февраля 2020

Зависит от языка. В этом ответе приводится пример в 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                                                            

Соберите все выше и выполните это 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=*                                                       

И вы получите этот вывод

SYSIN2 Job Output

Вы увидите, что одни и те же данные SYSIN повторяются три раза.

Для программы 'C' эта ссылка в документации IBM для C Компилятора содержит некоторые советы по перемотке.

Чтобы открыть в потоке данных, вызовите библиотечную функцию fopen () или freopen () и укажите ddname набора данных. Вы можете открыть набор данных в потоке только для чтения. Указание любого из режимов обновления, записи или добавления завершается неудачно. После того, как вы открыли набор данных в потоке, вы не можете получить или изменить положение файла, кроме как путем перемотки. Это означает, что вызовы fseek (), ftell (), fgetpos () и fsetpos ( ) для наборов данных в потоке не удается. Вызов rewind () приводит к тому, что z / OS XL C / C ++ открывает файл заново, оставляя позицию файла в начале.

То, что вы ищете, возможно, но реализация зависит от языка.

...