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