Как получить уникальную очередь сообщений POSIX?

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


person Norman Ramsey    schedule 23.04.2011    source источник


Ответы (1)


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

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

Мимикрия IPC_PRIVATE

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

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

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

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

person pilcrow    schedule 15.06.2011