Чтение из очереди сообщений (неблокирование, если пусто)
Я пишу в очередь сообщений
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.
Он покажет вам очереди, которые вы создали.