gpt4 book ai didi

c - msgrcv 获取空白消息

转载 作者:行者123 更新时间:2023-11-30 19:24:16 25 4
gpt4 key购买 nike

我有两个程序通过 IPC 队列相互发送和接收消息。然而,有时 msgrcv 函数会得到一条空白消息,而不是接收通过队列实际发送的消息。我已经注释掉了一个我认为应该有效的修复程序,但我想在这里检查一下,看看这是否是使用 msgrcv 和 msgsnd 的正确方法。

消息:

int readqueue(int qid, long type, char *msg)
{
int retval;

// Current fix for blank messages
/* strcpy(MsgQueue.Message, "");

while (strcmp(MsgQueue.Message, "") == 0)
{
retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);

if (strcmp(MsgQueue.Message, "") == 0)
printf("msgrcv fail\n");
}*/

retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);
strcpy(msg, MsgQueue.Message);

return retval;
}



消息:

int sendqueue(int qid, long type, char *msg)
{
struct msqid_ds stat_buf, *pstat_buf;
int av, retval;

pstat_buf = &stat_buf;
av = 0;

/* Make sure there's space in the queue */
do
{
retval = msgctl( qid, IPC_STAT, pstat_buf);
if (retval == -1)
{
fprintf(stderr, "msgctl in sendqueue failed! Error = %d\n", errno);
return retval;
}
} while ( pstat_buf->msg_qbytes - pstat_buf->msg_cbytes == 0);

strcpy(MsgQueue.Message, msg);
MsgQueue.MsgType = (long)type;

retval = msgsnd(qid, &MsgQueue, MSGSIZE, 0);

memset(MsgQueue.Message, '\0', MSGSIZE-1);
return retval;
}

最佳答案

您说:“但是,有时 msgrcv 函数会收到一条空白消息,而不是接收通过队列实际发送的消息”

我建议弄清楚实际发生的情况作为调试问题的方法。

msgrcv 将返回读取的字节数或 -1 错误...您应该检查并查看实际发生的情况。

如果它是 -1,则设置 errno 并且它可以告诉您很多信息。手册页列出了所有这些。

关于c - msgrcv 获取空白消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com