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