/*********************************************************************************
|
* Copyright: (C) 2025 LingYun IoT System Studio
|
* All rights reserved.
|
*
|
* Filename: mq_recv.c
|
* Description: This file is Message Queue(receiver) example program.
|
*
|
* Version: 1.0.0(11/10/2025)
|
* Author: Guo Wenxue <guowenxue@gmail.com>
|
* ChangeLog: 1, Release initial version on "11/10/2025 10:06:53 AM"
|
*
|
********************************************************************************/
|
#include <stdio.h>
|
#include <string.h>
|
#include <errno.h>
|
#include <unistd.h>
|
#include <stdlib.h>
|
#include <sys/types.h>
|
#include <sys/ipc.h>
|
#include <sys/msg.h>
|
|
#define FTOK_PATH "/dev/zero"
|
#define FTOK_PROJID 0x22
|
|
typedef struct msg_s
|
{
|
long mtype;
|
char mtext[512];
|
} msg_t;
|
|
int main(int argc, char **argv)
|
{
|
key_t key;
|
msg_t msg;
|
int msgid;
|
int msgtype=2;
|
int i;
|
|
if( (key=ftok(FTOK_PATH, FTOK_PROJID)) < 0 )
|
{
|
printf("ftok() get IPC token failure: %s\n", strerror(errno));
|
return -1;
|
}
|
|
msgid = msgget(key, IPC_CREAT|0666);
|
if( msgid < 0)
|
{
|
printf("shmget() create shared memroy failure: %s\n", strerror(errno));
|
return -2;
|
}
|
printf("key[%d] msgid[%d] msgypte[%d]\n", (int)key, msgid, msgtype);
|
|
printf("Waiting for messages...\n");
|
while(1)
|
{
|
memset(&msg,0,sizeof(msg));
|
if( msgrcv(msgid, &msg, sizeof(msg.mtext), msgtype, 0) < 0 )
|
{
|
printf("msgsnd() receive message failure: %s\n", strerror(errno));
|
break;
|
}
|
|
printf("Received: %s", msg.mtext);
|
if (strncasecmp(msg.mtext, "exit", 4) == 0)
|
break;
|
}
|
|
msgctl(msgid, IPC_RMID, NULL);
|
return 0;
|
}
|