unionmsg.c

来自「这是个通讯程序」· C语言 代码 · 共 132 行

C
132
字号
//	Author:		Wolfgang Wang//	Date:		2001/8/29#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include "CommMsg.h"#include "CommMain.h"TUnionIDOfMsgBuf UnionInitializeMessageBuffer(TUnionUserIDOfMsgBuf UserIDOfMsg){	TUnionIDOfMsgBuf	IDOfMsg;	if (UserIDOfMsg <= 0)	{		UnionUserErrLog("in UnionInitializeMessageBuffer:: UserIDOfMsg [%d] must >= 0\n",UserIDOfMsg);		return(-1);	}		if ( (IDOfMsg = msgget(UserIDOfMsg,0)) == -1)		IDOfMsg = msgget(UserIDOfMsg,0666 | IPC_CREAT);	if (IDOfMsg == -1)	{		UnionSystemErrLog("in UnionInitializeMessageBuffer:: cannot get queue id = %d\n",UserIDOfMsg);		return(gErrHostCommCallingMsgget);	}    	return (IDOfMsg); }int UnionReleaseMessageBuffer(TUnionUserIDOfMsgBuf UserIDOfMsg){	TUnionIDOfMsgBuf IDOfMsg;	char buf[513];	if ((IDOfMsg = msgget(UserIDOfMsg,0666)) == -1)	{		UnionSystemErrLog("in UnionReleaseMessageBuffer::msgget fail! Message user ID = [%d]\n",IDOfMsg);		return(gErrHostCommCallingMsgget);	}	memset(buf,0,513);	sprintf(buf,"ipcrm -q %d",IDOfMsg);	if (system(buf) < 0)	{		UnionSystemErrLog("in UnionReleaseMessageBuffer:: ipcrm -q [%d]\n",IDOfMsg);		return(gErrHostCommCallingIpcrm);	}	return(0);}int UnionCleanMessageBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg){	TUnionMsgInQueue	sysmsg;	int	nNumber=0;		memset(sysmsg.mtext,0,1024);	for (;;)	{		if (msgrcv(IDOfMsgBuf,&sysmsg,1024,IDOfMsg,IPC_NOWAIT) < 0)			break;		nNumber++;	} 	return (nNumber);}int UnionAddMessageToBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg,PUnionAddress pMsgBuf,int nMsgBufLen){	TUnionMsgInQueue     sysmsg;	if (nMsgBufLen > 1024)	{		UnionSystemErrLog("in UnionAddMessageToBuffer:: Message buffer too long [%d]\n",nMsgBufLen);		return (-1);	}    	sysmsg.mtype = IDOfMsg;	memset(sysmsg.mtext,0,1024);	memcpy(sysmsg.mtext,pMsgBuf,nMsgBufLen);	if (msgsnd(IDOfMsgBuf,&sysmsg,nMsgBufLen,~IPC_NOWAIT) == -1)	{		UnionSystemErrLog("in UnionAddMessageToBuffer: send msg to message queue [%d],Message buffer = *%s*\n",IDOfMsg,pMsgBuf);		return (gErrHostCommCallingMsgsnd);	}	return(0);}int UnionGetFirstMessageFromBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,PUnionIDOfMsg pIDOfMsg,PUnionAddress pMsgBuf){	TUnionMsgInQueue	sysmsg;	int			rc;	memset(sysmsg.mtext,0,1024);	if ((rc = msgrcv(IDOfMsgBuf,&sysmsg,1024,0L,~IPC_NOWAIT)) == -1)	{		UnionSystemErrLog("in UnionGetFirstMessageFromBuffer:: msgrcv from queue = [%d]\n",IDOfMsgBuf);		return (gErrHostCommCallingMsgrcv);	}	memcpy(pMsgBuf,sysmsg.mtext,rc);	*pIDOfMsg = sysmsg.mtype;		return(rc);}int UnionGetSpecifiedMessageFromBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg,PUnionAddress pMsgBuf){	TUnionMsgInQueue	sysmsg;	int			rc;	memset(sysmsg.mtext,0,1024);    	if ((rc = msgrcv(IDOfMsgBuf,&sysmsg,1024,IDOfMsg,~IPC_NOWAIT)) < 0)	{		UnionSystemErrLog("in UnionGetSpecifiedMessageFromBuffer:: msgrcv from queue = %d msgid = %ld\n",IDOfMsg,IDOfMsg); 		return (gErrHostCommCallingMsgrcv);	}	memcpy(pMsgBuf,sysmsg.mtext,rc);	return (rc);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?