Tools

30. ユーザー待ち行列からデータを受信する RCVUSRQ

ユーザー待ち行列( *USRQ ) を読み取るにも MI (マシン・インターフェース) を
利用する必要がある。
読み取るには deqideq の2つの MI が用意されているが
直ちに読み取るには deqi を使用して、一定の時間または永続待機で読み取るには
deq を使用する必要がある。
deq は読み取りに失敗するとすぐに終了するようなジョブに使用するものであり、
deqi は待機を必要とするジョブに使用する。

【 RCVUSRQ 】
----------------------------------------------------------------------------------
0001.00 /********************************************************************/    
0002.00 /*                                                                  */    
0003.00 /*   RCVUSRQ     :   ユーザー待ち行列の受信                         */    
0004.00 /*                                                                  */    
0005.00 /*          Office Quattro Co,.Ltd 2008/09/15 12:24:45 changed      */    
0006.00 /*         [Ver5.1] RCVUSR_W を追加した (FOR PFRMON)                */    
0007.00 /*                                                                  */    
0008.00 /********************************************************************/    
0009.00 #include <stdio.h>                                                        
0010.00 #include <stdlib.h>                                                       
0011.00 #include <string.h>                                                       
0012.00 #include <miqueue.h>                                                      
0013.00 #include <qusec.h>                                                        
0014.00 #include <miptrnam.h>                                                     
0015.00 #include <signal.h>                                                       
0016.00 #include <unistd.h>   /* sleep */                                         
0017.00                                                                           
0018.00 #define TRUE         0                                                    
0019.00 #define FALSE       -1                                                    
0020.00 /*************************************************************/           
0021.00 /*       EXPORT  関  数                            */           
0022.00 /*************************************************************/           
0023.00 void RCVUSR(char* usrq, char* usrqlib, char rcvdta[256]);                 
0024.00 /*************************************************************/    
0025.00 /*       内 部 使 用  関  数                          */    
0026.00 /*************************************************************/    
0027.00 /*************************************************************/    
0028.00 /*       IMPORT  関  数                            */    
0029.00 /*************************************************************/    
0030.00 /*************************************************************/    
0031.00 /*       外 部 呼 出 し  関  数                      */    
0032.00 /*************************************************************/    
0033.00 /*************************************************************/    
0034.00 /*        グ ロ ー バ ル 変 数                         */    
0035.00 /*************************************************************/    
0036.00                                                                    
0037.00 /*************************************************************/    
0038.00 /*       EXPORT  関  数                            */    
0039.00 /*************************************************************/    
0040.00 /*******************************************************/          
0041.00 void RCVUSR(char* usrq, char* usrqlib, char rcvdta[256])           
0042.00 /*******************************************************/          
0043.00 {                                                                  
0044.00    _DEQ_Msg_Prefix_T d_msg_prefix;                                 
0045.00    _SYSPTR queue;                                                  
0046.00    int rc, i, pos, try = FALSE;                                    
0047.00    char* ptr;                                                      
048.00    char rcvbuf[256];                                             
049.00   volatile _INTRPT_Hndlr_Parms_T ca;                             
050.00 int err;                                                         
051.00                                                                  
052.00     err=1;                                                       
053.00     #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE,     
054.00                                        _CTLA_HANDLE)             
055.00    queue = rslvsp(_Usrq, usrq, usrqlib, _AUTH_ALL);              
056.00    memset(rcvbuf, 0, sizeof(rcvbuf));                            
057.00    d_msg_prefix.Wait_Forever = -1;                               
058.00 READ:                                                            
059.00    memset(rcvbuf, 0, sizeof(rcvbuf));                            
060.00    rc = deqi(&d_msg_prefix, rcvbuf, queue); /*RCVUSRQ no-wait */ 
061.00    if(rc == 0 && try < 5){                                       
062.00      sleep(0.4); try ++; goto READ;                              
063.00    }                                                             
064.00      memset(rcvdta, 0, sizeof(rcvdta));                          
065.00    if(rc != 0){/* 正常受信 */                                    
066.00      strcpy(rcvdta, rcvbuf);                                     
067.00    }/* 正常受信 */                                               
068.00    else{/* 失敗 */                                               
069.00      memcpy(rcvdta, "++++++++++", 10);                           
070.00    }/* 失敗 */                                                   
071.00    return;                                                       
0072.00 MONMSG:                                                                     
0073.00    memset(rcvdta, 0, sizeof(rcvdta));                                       
0074.00    memcpy(rcvdta, "*ERROR", 6);                                             
0075.00    return;                                                                  
0076.00 }                                                                           
0077.00 /*********************************************************/                 
0078.00 void RCVUSR_W(char* usrq, char* usrqlib, char rcvdta[256])                  
0079.00 /*********************************************************/                 
0080.00 {                                                                           
0081.00    _DEQ_Msg_Prefix_T d_msg_prefix;                                          
0082.00    _SYSPTR queue;                                                           
0083.00    int rc, i, pos, try = FALSE;                                             
0084.00    char* ptr;                                                               
0085.00    char rcvbuf[256];                                                        
0086.00   volatile _INTRPT_Hndlr_Parms_T ca;                                        
0087.00 int err;                                                                    
0088.00                                                                             
0089.00     err=1;                                                                  
0090.00     #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, \               
0091.00                                        _CTLA_HANDLE)                        
0092.00    queue = rslvsp(_Usrq, usrq, usrqlib, _AUTH_ALL);                         
0093.00    memset(rcvbuf, 0, sizeof(rcvbuf));                                       
0094.00    d_msg_prefix.Wait_Forever = 1;                                           
0095.00    deq(&d_msg_prefix, rcvbuf, queue); /*RCVUSRQ wait forever*/              
0096.00    return;                                 
0097.00                                            
0098.00 MONMSG:                                    
0099.00    memset(rcvdta, 0, sizeof(rcvdta));      
0100.00    memcpy(rcvdta, "*ERROR", 6);            
0101.00    return;                                 
0102.00 }                                          
----------------------------------------------------------------------------------
【 コンパイル 】
CRTCMOD MODULE(QTEMP/RCVUSRQ) SRCFILE(MYSRCLIB/QCSRC) AUT(*ALL)
CRTSRVPGM SRVPGM(MYLIB/RCVUSRQ) MODULE(QTEMP/RCVUSRQ) EXPORT(*ALL) ACTGRP(*CALLER) AUT(*ALL)