关于Linux报 no message of desired type 的错误,这通常是由以下三种原因引起的:
-
对于给定的消息类型,没有发送者发送消息。
-
接收方在接收特定类型的消息之前未注册通信键。
-
消息队列的权限不正确或操作系统不正确配置。
如果遇到此问题,请尝试以下解决方法:
- 确认消息队列是否正确初始化。
如果消息队列没有正确初始化,可能会导致 no message of desired type 错误。在Linux上,消息队列是通过调用msgget函数而创建的。这个函数接受三个参数,其中第一个是一个标识符。如果在调用msgget时使用相同的标识符,该函数将返回消息队列的描述符。如果使用不同的标识符,则将创建新的消息队列。
以下是一个示例程序,它初始化了一个消息队列,并检查了是否成功创建:
#include
#include
#include
#include
#include
#define QUEUE_KEY 1234
typedef struct message {
long int message_type;
char message_text[100];
} message_t;
int main() {
int queue_id = msgget(QUEUE_KEY, IPC_CREAT | 0666);
if (queue_id == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
printf("Message queue created with ID: %d\n", queue_id);
return 0;
}
- 确认消息的类型和接收方是否正确匹配。
要在 Linux 上发送或接收消息,我们需要一个唯一的整数值,即消息类型。当发送消息时,需要指定消息类型,并将其作为msgsnd函数的参数之一。当接收消息时,需要指定希望接收的消息类型,并作为msgrcv函数的参数之一。
以下是一个示例程序,它发送和接收消息,并检查接收到的消息是否为所需的类型:
#include
#include
#include
#include
#include
#define QUEUE_KEY 1234
typedef struct message {
long int message_type;
char message_text[100];
} message_t;
int main() {
int queue_id = msgget(QUEUE_KEY, IPC_CREAT | 0666);
if (queue_id == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
message_t message;
// Send message
message.message_type = 1;
strcpy(message.message_text, "Hello, world!");
if (msgsnd(queue_id, &message, sizeof(message_t), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
// Receive message
if (msgrcv(queue_id, &message, sizeof(message_t), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("Received message: %s\n", message.message_text);
return 0;
}
- 确认消息队列的权限和操作系统配置是否正确。
如果消息队列的权限不正确或操作系统不正确配置,也可能会导致 no message of desired type 错误。您可以使用命令ipcs检查Linux上当前存在的消息队列列表,然后查看每个消息队列的所有者、组、权限等信息。同时,您还可以查看操作系统的配置是否正确,并确保已经启用了消息队列。
综上所述,当遇到 no message of desired type 错误时,您需要先确认消息队列是否正确初始化、消息的类型和接收方是否匹配,以及消息队列的权限和操作系统配置是否正确。如果以上几点都正确无误,而错误依然存在,请使用errno变量来了解详细的错误信息,以便更好地调试您的代码。