CL

59. ユーザー待ち行列の作成

最も高速なプロセス間通信を行いたいのであればユーザー待ち行列( *USRQ ) による通信が
ベストである。共有メモリによる通信の API もOS400 には用意されているが、実際に試したところ
ユーザー待ち行列( *USRQ ) による通信のほうが最速であった。
*USRQ はオブジェクトとして定義されているが実体はメモリであるので速いのである。
*USRQ の作成には QUSCRTUQ という API を使って作成する必要がある。
次のサンプル CLP ソースではライブラリー QTEMPCMD という名前の *USRQ を
QUSCRTUQ を使って作成している。

*USRQ の読み取りや書き込みは MI (マシンインターフェース) を必要とするため
C言語による記述が必要となる。このため読み取りと書き込みは Tools にサンプルを公開しているので
そちらを参考にされたい。

0001.00              PGM                                                            
0002.00 /*---------------------------------------------------------*/               
0003.00 /*   USCRTUQ     :   RUNQRY *NONE QUSRSYS/ACCESSLOG        */               
0004.00 /*---------------------------------------------------------*/               
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                       
0006.00              DCL        VAR(&QNAMELIB) TYPE(*CHAR) LEN(20) +                
0007.00                           VALUE('CMDQ      QTEMP     ')                     
0008.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +                   
0009.00                           VALUE(X'00000000') /* 2 進数  */                  
0010.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')          
0011.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))             
0012.00                                                                             
0013.00              CHGVAR     VAR(&QNAMELIB) VALUE('TESTQ     QTEMP     +         
0014.00                           ' *CAT &NULL)                                     
0015.00              CALL       PGM(QUSCRTUQ) PARM(&QNAMELIB 'PF        ' +         
0016.00                           'F' 0 1000 100 3 '*ALL      ' 'DSPTEMP CMDQ')     
0017.00                                                                             
0018.00  ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                                  
0019.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                            
0020.00              ENDPGM