63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
#include "MessageQueue.h"
|
|
#include "Log.h"
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/msg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
MessageQueue::MessageQueue(const SF_CHAR *path) : pathname(path)
|
|
{
|
|
pMsgQueueId = -1;
|
|
}
|
|
SINT32 MessageQueue::MessageQueueCreate(void)
|
|
{
|
|
key_t key;
|
|
SF_CHAR touchPath[128] = {0};
|
|
if (access(pathname, F_OK) != 0)
|
|
{
|
|
sprintf(touchPath, "%s %s", "touch", pathname);
|
|
system(touchPath);
|
|
}
|
|
if ((key = ftok(pathname, 'z')) < 0)
|
|
{
|
|
LogInfo("ftok error");
|
|
return SF_FAILURE;
|
|
}
|
|
if ((pMsgQueueId = msgget(key, IPC_CREAT | 0660)) == -1)
|
|
{
|
|
LogError("MsgQueueId = %#x\n", pMsgQueueId);
|
|
LogError("msgget failed errno.%02d is: %s\n", errno, strerror(errno));
|
|
return SF_FAILURE;
|
|
}
|
|
LogInfo("MsgQueueId = %#x\n", pMsgQueueId);
|
|
return SF_SUCCESS;
|
|
}
|
|
SINT32 MessageQueue::MessageQueueRecv(SF_MESSAGE_BUF_S *pMessageBuf)
|
|
{
|
|
// size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->arg1) + sizeof(pMessageBuf->arg2) + sizeof(pMessageBuf->arg3);
|
|
size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->paramLen) + QUEUE_BUF_LENGTH;
|
|
if (msgrcv(pMsgQueueId, pMessageBuf, msgsz, 0, IPC_NOWAIT) == -1)
|
|
{
|
|
return SF_FAILURE;
|
|
}
|
|
return SF_SUCCESS;
|
|
}
|
|
SINT32 MessageQueue::MessageQueueSend(SF_MESSAGE_BUF_S *pMessageBuf)
|
|
{
|
|
if (!pMessageBuf)
|
|
{
|
|
LogError("pMessageBuf is nullptr.\n");
|
|
return SF_FAILURE;
|
|
}
|
|
pMessageBuf->mtype = 1;
|
|
// size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->arg1) + sizeof(pMessageBuf->arg2) + sizeof(pMessageBuf->arg3);
|
|
size_t msgsz = sizeof(pMessageBuf->cmdId) + sizeof(pMessageBuf->s32Wait) + sizeof(pMessageBuf->paramLen) + pMessageBuf->paramLen;
|
|
if (msgsnd(pMsgQueueId, pMessageBuf, msgsz, 0) == -1)
|
|
{
|
|
return SF_FAILURE;
|
|
}
|
|
return SF_SUCCESS;
|
|
} |