Как получить уникальную очередь сообщений POSIX? - PullRequest
5 голосов
/ 23 апреля 2011

Я работаю над простым параллельным приложением, в котором я хочу использовать один процесс для поддержки информации о состоянии семейства рабочих процессов.Кажется, относительно легко настроить очередь сообщений POSIX, в которой все рабочие пчелы могут периодически отправлять обновления ответственному за состояние.Моя проблема?Очередь сообщений POSIX должна иметь имя.Я не хочу выбирать имя;все, что меня волнует, это получение уникальной очереди сообщений, так же, как я бы использовал очереди сообщений SYSV с IPC_PRIVATE.Для уникального имени файла я мог бы использовать mkstemp(3) или для уникального дескриптора открытого файла я мог бы использовать tmpfile(3). Как получить уникальную очередь сообщений POSIX?

1 Ответ

3 голосов
/ 15 июня 2011

Я не хочу выбирать имя; все, что меня волнует, - это получение уникальной очереди сообщений, так же, как я бы использовал очереди сообщений SYSV с IPC_PRIVATE

Что ж, с очередями сообщений POSIX, вы do должны указать имя, но вам не нужно ни его сохранять, ни позволять другим использовать ту же очередь с этим именем.

IPC_PRIVATE Мимикрия

Делайте то, что mkstemp и tmpfile делают под капотом. Заимствуйте любой из алгоритмов выбора имени «tmp» / «temp», чтобы сгенерировать что-то «/ разумно_уникальное», mq_open it O_CREAT | O_EXCL, а затем mq_unlink it. Затем дочерние рабочие процессы могут наследовать дескриптор очереди сообщений.

Предостережение: может ли root или ваш EUID стать мошенником выяснить, что вы делаете, и прыгнуть между mq_open и mq_unlink? Да.

Альтернативная реализация

В качестве альтернативы используйте взамен SOCK_DGRAM socketpair или pipe. Они предлагают семантику, аналогичную очередям сообщений POSIX & mdash; attr.mq_msgsize становится SO_SNDBUF / SO_RCVBUF или соглашением о соблюдении PIPE_BUF, mq_notify становится возможностью выбора ввода / вывода (вероятно, уже имеет место) & mdash; хотя вы теряете приоритеты сообщений.

...