Чтение из очереди сообщений (неблокирование, если пусто)

Я пишу в очередь сообщений

if (msgsnd(q, &msg, sizeof(message), slaves_list[to]) == -1)

и чтение

if (msgrcv(q, &msg, sizeof(message), id, 0) == -1)

но что, если эта очередь пуста? Как это проверить? Если нет ничего, я хочу выполнить следующую инструкцию в цикле

3 ответа

Решение

Использование IPC_NOWAIT, Из документации:

Если (msgflg & IPC_NOWAIT) не равен нулю, вызывающий поток немедленно вернется с возвращаемым значением -1 и errno установлен в [ENOMSG],

Используйте IPC_NOWAIT для параметра msgflg: http://man7.org/linux/man-pages/man2/msgsnd.2.html

IPC_NOWAIT Возврат немедленно, если в очереди нет сообщений запрошенного типа. Системный вызов завершается ошибкой с errno, установленным в ENOMSG.

Вы можете проверить, пуста ли очередь, используя

ipcs

Команда в терминале Linux.

Он покажет вам очереди, которые вы создали.

Другие вопросы по тегам