C库消息队列未读取所有消息

62lalag4  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(118)

我运行这个代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>

// Define a structure for our messages
struct message {
  long msg_type;
  char msg_text[100];
};

int main() {
  key_t key;
  int msg_id;
  struct message msg;

  // Generate a key for the message queue
  key = ftok("progfile", 'A');

  // Create the message queue
  msg_id = msgget(key, 0666 | IPC_CREAT);

  // Prepare messages to send
  struct message messages[3] = {{1, "This is message with priority 1"},
                                {2, "This is message with priority 2"},
                                {3, "This is message with priority 3"}};

  // Send the messages
  for (int i = 0; i < 3; i++) {
    msgsnd(msg_id, &messages[i], sizeof(messages[i]), 0);
  }

  // Receive the messages
  for (int i = 1; i <= 3; i++) {
    memset(&msg, 0, sizeof msg);
    if (msgrcv(msg_id, &msg, sizeof(msg), 0, IPC_NOWAIT) != -1) {
      printf("Received message: %s\n", msg.msg_text);
    } else {
      printf("No message in the queue\n");
    }
  }

  // Destroy the message queue
  msgctl(msg_id, IPC_RMID, NULL);

  return 0;
}

字符串
我期望它打印出所有三条消息,但实际上它只打印:

Received message: This is a message with priority 1
No message in the queue
No message in the queue


并且msgctl没有运行,因为当我ipcs时,我仍然可以看到消息队列活动,即使在此代码完成之后。
根据我所读到的,msgrcv(msg_id, &msg, sizeof(msg), 0, IPC_NOWAIT)将读取并删除第一条可用的消息,并将类型arg设置为0。但实际上,它只读取1条消息,然后它不能读取任何消息,这让我感到困惑。我使用gdb进行了调试,发现即使消息队列仍然有消息,msgrcv也不会检索消息。另一件奇怪的事情是,如果我将这段代码分成两个文件,并在两个进程中运行发送和读取逻辑,读取进程可以读取所有3条消息。我不知道这有什么区别。谢谢你的帮助!

w7t8yxp5

w7t8yxp51#

错误在msgsndmsgrcv中,它们应该是

msgsnd(msg_id, &messages[i], sizeof(messages[i].msg_text), 0);

字符串
和/或

if (msgrcv(msg_id, &msg, sizeof(msg.msg_text), 0, IPC_NOWAIT) != -1)


第三个参数msgsz应该只包含消息msg_text的大小。

相关问题