Как выбрать Ключ для межпроцессного взаимодействия в Linux?

Добрый день...

Я делаю домашнее задание, в котором говорится, что у меня есть 5 процессов; сервер, а остальные клиенты. Каждый процесс должен запускаться из другого исполняемого файла. Я собираюсь реализовать решение для двусторонней передачи сообщений, но вопрос не в передаче сообщений как таковой. Есть ли элегантный способ передать ключ между этими разными исполняемыми файлами. то есть когда я вызываю следующую функцию:

int msgget(key_t key, int msgflg);

Как другие процессы должны знать ключ?

В моей домашней работе можно использовать заранее определенный ключ, но я хотел бы знать, как это можно сделать в реальной программе. Потому что «я понимаю», что может произойти конфликт, если несвязанный процесс запрашивает мой ключ на машине какого-либо пользователя.


person AraK    schedule 15.01.2010    source источник


Ответы (3)


одно соглашение заключается в использовании ftok() для создания уникального ключа из человек

Функция ftok() использует идентификатор файла, названного по заданному пути (который должен относиться к существующему, доступному файлу) и младшим значащим 8 битам proj_id (который должен быть ненулевым) для создания типа key_t System V. Ключ IPC, подходящий для использования с msgget(2), semget(2) или shmget(2).

Результирующее значение одинаково для всех путей, которые называют один и тот же файл, когда используется одно и то же значение proj_id. Возвращаемое значение должно отличаться, если различаются (одновременно существующие) файлы или идентификаторы проектов.

person jspcal    schedule 15.01.2010
comment
Спасибо. Извините, если я неправильно понял ответ, но как мне разделить этот сгенерированный ключ между исполняемыми файлами? то есть после того, как я получу ключ на сервере, как мне передать его одному из клиентов? - person AraK; 15.01.2010
comment
Запустив ftok с тем же аргументом в файле client. - person hobbs; 15.01.2010
comment
@hobbs Если я правильно прочитал описание, в нем говорится, что по этому пути должен существовать файл, поэтому предопределенная случайная длинная строка не подходит. - person AraK; 15.01.2010

Насколько я знаю, вы обычно генерируете псевдослучайный ключ для своей программы и вставляете его туда. Существует 2^32 возможных ключа, поэтому вероятность столкновения довольно мала.

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

person Anon.    schedule 15.01.2010
comment
Вот почему я пришел в голову, может быть, я предполагаю, что столкновение может произойти там, где на самом деле этого не происходит на практике. Я бы выбрал этот ответ, если не предлагается другое решение :) - person AraK; 15.01.2010

Для «глобальных» ресурсов я поддерживаю ответ jspcal ftok(), который он получил прямо передо мной :)

Если у вас есть куча связанных процессов (то есть родитель и куча дочерних) и они должны совместно использовать очередь, то вам следует вызвать msgget с IPC_PRIVATE, который создаст очередь с неиспользуемым ключом и вернет ей дескриптор.

person hobbs    schedule 15.01.2010