我运行这个代码:
#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条消息。我不知道这有什么区别。谢谢你的帮助!
1条答案
按热度按时间w7t8yxp51#
错误在
msgsnd
和msgrcv
中,它们应该是字符串
和/或
型
第三个参数
msgsz
应该只包含消息msg_text
的大小。