注册

Linux报 “no message of desired type” 异常的原因以及解决办法

关于Linux报 no message of desired type 的错误,这通常是由以下三种原因引起的:

  1. 对于给定的消息类型,没有发送者发送消息。

  2. 接收方在接收特定类型的消息之前未注册通信键。

  3. 消息队列的权限不正确或操作系统不正确配置。

如果遇到此问题,请尝试以下解决方法:

  1. 确认消息队列是否正确初始化。

如果消息队列没有正确初始化,可能会导致 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;
}
  1. 确认消息的类型和接收方是否正确匹配。

要在 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;
}
  1. 确认消息队列的权限和操作系统配置是否正确。

如果消息队列的权限不正确或操作系统不正确配置,也可能会导致 no message of desired type 错误。您可以使用命令ipcs检查Linux上当前存在的消息队列列表,然后查看每个消息队列的所有者、组、权限等信息。同时,您还可以查看操作系统的配置是否正确,并确保已经启用了消息队列。

综上所述,当遇到 no message of desired type 错误时,您需要先确认消息队列是否正确初始化、消息的类型和接收方是否匹配,以及消息队列的权限和操作系统配置是否正确。如果以上几点都正确无误,而错误依然存在,请使用errno变量来了解详细的错误信息,以便更好地调试您的代码。