Проверьте 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");
}