Проверьте msqid, чтобы увидеть, есть ли сообщение без ожидания или msgrcv

Спасибо всем за проверку.

Я хотел знать, есть ли способ проверить очередь сообщений (msqid) и посмотреть, есть ли какие-либо сообщения в очереди. Если нет, я бы хотел продолжить. Единственный способ, который мне удалось найти в Интернете, - это использовать msgrcv с IPC_NOWAIT, но это выдает ENOMSG, если сообщение не найдено. Я хотел бы продолжить, несмотря на отсутствие сообщения.

Мой код слишком загроможден, чтобы я мог публиковать его и гордиться им, поэтому я опубликую некоторый псевдокод того, что я хочу сделать:

Main()
{
    Initialize queues;
    Initialize threads  //  4 clients and 1 server
    pthread_exit(NULL);
}
Server()
{
    while (1)
    {
        check release queue;  // Don't want to wait
        if ( release )
             increase available;
        else
             // Do nothing and continue

        Check backup queue;  // Don't want to wait
        if ( backup) 
            read backup; 
        else
            read from primary queue; // Will wait for message

        if ( readMessage.count > available )
            send message to backup queue;
        else
            send message to client with resources;
            decrease available;        
    } //Exit the loop
}

Client
{
    while(1)
    {
        Create a message;
        Send message to server, requesting an int;
        Wait for message;
        // Do some stuff
        Send message back to server, releasing int;
    } // Exit the loop
}

typedef struct {
    long to;
    long from;
    int count;
} request;

Насколько я могу судить, вы можете либо ждать бесконечно, либо вы можете проверить без ожидания и аварийно завершить работу, если там ничего нет. Я просто хочу проверить очередь без ожидания и продолжить.

Будем благодарны за любую помощь, которую вы можете оказать! Большое спасибо!

1 ответ

Вы знаете, что C ничего не "выбрасывает"? ENOMSG Это код ошибки, а не исключение или сигнал. Вы проверяете это с помощью errno если msgrcv возвращается -1,

Вы используете это так:

if (msgrcv(..., IPC_NOWAIT) == -1)
{
    /* Possible error */
    if (errno == ENOMSG)
    {
        printf("No message in the queue\n");
    }
    else
    {
        printf("Error receiving message: %s\n", strerror(errno));
    }
}
else
{
    printf("Received a message\n");
}
Другие вопросы по тегам