Использование очереди сообщений между несвязанными процессами

Я пытаюсь использовать очередь сообщений для связи между двумя несвязанными процессами в Linux. Я знаю, что использование общего значения ключа позволит нам открыть одну и ту же очередь сообщений в обоих несвязанных процессах. Но проблема в том, что иногда значение ключа, соответствующее очереди сообщений, может уже использоваться какой-то системной утилитой. Поэтому я использую IPC_CREAT | Флаги IPC_EXEL для обеспечения обязательного создания новой очереди сообщений.

В случае, если msgget() возвращает ошибку, я увеличиваю значение ключа и повторяю попытку создать новую очередь сообщений, пока не добьюсь успеха. Теперь проблема заключается в том, как передать это успешное значение ключа другому несвязанному процессу, который хочет работать с той же очередью сообщений.

Я что-то упускаю? Кто-нибудь сталкивался с подобными проблемами раньше?


person Saurabh Gandhi    schedule 06.11.2009    source источник


Ответы (3)


Используйте ftok(3). Он принимает имя пути и произвольный целочисленный идентификатор (использует только младшие 8 бит, поэтому обычно используется символ) и генерирует, возможно, уникальный key_t. Не гарантируется его уникальность, но с помощью идентификатора вы можете использовать тот же путь и предписывать приращения для идентификатора в случае коллизии.

Типичным исполнением будет:

Первичный использует ftok(3) для получения ключа.

Первичный использует флаги, чтобы указать, что ему нужна новая очередь сообщений. При ошибке увеличивает идентификатор и вызывает ftok, пока не получит подходящую очередь сообщений. Очередь сообщений создается с разрешениями, специфичными для пользователя/группы, от имени которых работает вторичный процесс (как можно более узкой, желательно уникальной для процесса).

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

person Matt    schedule 06.11.2009

IIRC, это именно та проблема, для решения которой используется ftok(3). . Программы, которые должны обмениваться данными, просто используют общий путь и значение ключа. Раньше мы передавали имя FIFO в командной строке нашим программам. Они передали бы это в ftok(), чтобы сгенерировать ключ для наших сегментов общей памяти.

person D.Shawley    schedule 06.11.2009

Вы можете просто перейти в 21 век и использовать очередь сообщений Posix, а не sysV. Очереди Posix имеют имена, а не непонятные номера. В Linux вы можете смонтировать файловую систему, чтобы увидеть их, и удалить их с помощью «rm».

person MarkR    schedule 06.11.2009