2013-08-05 3 views
0

Я использую очередь сообщений системы V. В моей программе один поток непрерывно добавляет данные в очередь сообщений, а другой поток извлекает данные из очереди сообщений.чтение данных из очереди сообщений по возрастанию

мое сообщение структура очереди формат

struct mymsgbuf { 
    long mtype; 
    char mtext[MAX_SEND_SIZE]; 
}; 

, когда я с mtext из сообщения мне нужно получить данные в порядке возрастания зависит от tag.

моя очередь сообщений получить

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recvbuf, MAX_SEND_SIZE, 0, 0) 

выше возвращения формата из первых отправки данных в очереди сообщений.

Есть ли способ получения очереди сообщений в порядке возрастания?

+0

Вы пробовали сообщения posix («man mq_overview»), он имеет приоритет, связанный с каждым сообщением. Проблема в том, что вы можете иметь 32768 различных приоритетов в linux-реализации очередей сообщений posix. – rbelli

+0

проблема с очередью сообщений posix заключается в том, что мы можем хранить только 10 сообщений, поэтому потеря данных произойдет, если мы не будем считывать данные из очереди, минимум мне нужно сохранить 25 сообщений в очереди – sujin

+1

Вы можете изменить лимит сообщений, изменив/proc/SYS/фс/mqueue/msg_max – Duck

ответ

0

Если tag является целым числом (или может быть преобразовано в одно), то для этого используется поле mtype. Вы просто используете tag как type.

На msgrcv вы указываете, какой тип вы хотите прочитать в 4-м параметре. Как правило, вы не хотите блокировать, если нет сообщения этого типа для чтения, поэтому вы также должны использовать флаг IPC_NOWAIT. Так типа чтения/тег 2 это будет:

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recvbuf, MAX_SEND_SIZE, 2, IPC_NOWAIT); 

Есть некоторые другие игры вы можете играть чтение mtypes например, читать первое сообщение в очереди, которое не Type 2

q_ret = msgrcv(msgqueue_id, (struct mymsgbuf *)&recMSG_EXCEPTvbuf, MAX_SEND_SIZE, 2, IPC_NOWAIT | MSG_EXCEPT); 

Они описаны на странице msgrcv человека. Если вы обнаружите, что ваши схемы типов становятся слишком сложными, это знак, который вы можете захотеть укусить пулю и использовать какой-то другой тип IPC или структуры данных.

Смежные вопросы