【发布时间】:2020-11-21 02:47:14
【问题描述】:
如果 flag 设置为 0,我的程序在 msgrcv 函数上接收错误数据,但是,如果我将特定数据的 flag 设置为 1,则 msgrcv 函数将继续等待。我在公共文件中定义了发送和接收函数,并从发送者和接收者文件中调用它。我检查了调试数据,它已正确发送,但在接收端,如果标志设置为 0 意味着接收到第一个数据包,那么我收到了错误的数据。如果将 flag 设置为 1,则表示特定消息类型数据 msgrcv 函数以等待状态结束。请帮忙。
/CommonMsgQueue.c/
int InitializeMsgQueue(char *keypath)
{
key_t key;
int msgid;
key = ftok(keypath,'B');
if (key == -1 )
{
perror("Failed to generate key ");
exit(0);
}
msgid = msgget(key, 0666 | IPC_CREAT );
if ( msgid == -1 )
{
perror("Failed to get msgid");
exit(0);
}
return msgid;
}
int SendMsg(key_t msgqid ,StMesgQ *MsgData , int msglength)
{
int iRetVal =0;
iRetVal = msgsnd(msgqid,&MsgData,sizeof(StMesgQ),IPC_NOWAIT);
if ( iRetVal == -1 )
{
perror("Failed to send message");
}
return iRetVal;
}
int RcvMsg(key_t msgqid, StMesgQ *MsgData , int msglength)
{
int iRetVal =0;
iRetVal = msgrcv(msgqid,&MsgData,msglength,0,0);
if (iRetVal == -1 )
{
perror("Failed to receive message ");
exit(0);
}
return iRetVal;
}
/*Sender.c*/
msgqid = InitializeMsgQueue("/home/nprabhat/Nitesh/Nitesh_FrameWork/Key/ClientQueue");
CommonSHMData = (struct CommonSHM*)ShmData;
StMesgQ obj;
while (1)
{
printf("Sender:-- Enter the value For iIndex\n");
scanf("%d",&value);
CommonSHMData->iIndex = value;
CommonSHMData->iIndex2 = value;
DataPktToSend = (char*)CommonSHMData;
memcpy(&obj.buf,&DataPktToSend,strlen(DataPktToSend));
obj.iMsgType = 1;
SendMsg(msgqid,&obj,sizeof(StMesgQ));
}
/*Reciever.c*/
RcvMsg(msgqid,&MsgData,sizeof(StMesgQ));
CommonSHMData_Recv = (struct CommonSHM*)MsgData.buf;
printf("Data Received from queue is %d",CommonSHMData_Recv->iIndex);
【问题讨论】:
-
您的代码似乎有误。 while 循环的右括号在哪里?代码中您的标志的名称是什么?
-
我没有发布我的完整代码。我在发布代码时错过了“while 循环”的右括号。 msgrcv 函数的第四个参数表示 flag 。我们可以根据需要设置为 0,-1 或 1。
-
请发minimal reproducible example,以便我们重现问题并帮助您调试。
-
给定
int RcvMsg(key_t msgqid, StMesgQ *MsgData , int msglength),代码msgrcv(msgqid,&MsgData,msglength,0,0);将消息内容放在MsgData的位置指针。
标签: c posix ipc message-queue system-calls