Как я могу очистить очередь сообщений IPC? - PullRequest
3 голосов
/ 12 октября 2009

Я использую функцию msgget() в своем приложении на основе IPC. Как очистить очередь, заполненную старыми очередями сообщений?

Ответы [ 4 ]

5 голосов
/ 12 октября 2009

Чтобы удалить очередь, используйте следующую команду:

msgctl(msgQID, IPC_RMID, NULL);

ВЫЗОВ СИСТЕМЫ: msgctl ()

1 голос
/ 08 октября 2014

Вы можете изменить атрибут очереди сообщений для O_NONBLOCK, используя mq_setattr . Затем очистите очередь, прочитав все сообщения, пока возвращаемое значение не покажет, что очередь пуста. Теперь верните старые атрибуты обратно.

Этот метод не оптимизирован во время выполнения, но позволяет избежать необходимости закрывать и открывать очередь сообщений.

1 голос
/ 12 октября 2009

Обходной путь - увеличить MSGMNI Максимальное количество сообщений в системе: в зависимости от политики (в Linux этот предел можно прочитать и изменить с помощью / proc / sys / kernel / msgmni *). 1004 *).

0 голосов
/ 13 октября 2009

Эти постоянные проблемы с выделением ресурсов (есть аналогичные проблемы с общей памятью) - вот почему API System V обычно считаются устаревшими. В этом случае вы рассматривали возможность использования доменного сокета Unix или FIFO вместо очереди сообщений? Они появляются в файловой системе и могут быть «очищены», когда они больше не используются с такими инструментами, как rm.

...