Полагаю, этот вопрос адресован экспертам по системному программированию Linux / Unix (к сожалению, я пока не такой;)).
Я строю систему, которая работает на Linux / Unix, многоядерной машине, в которой процессы взаимодействуют друг с другом через разделяемую память (важна скорость - минимальные обращения к ядру, насколько это возможно).
«Каналы» общей памяти для связи динамически создаются, когда процесс запрашивает связь с другим - у каждого процесса есть поток прослушивания, который получает и «принимает» эти запросы, а затем создает / инициализирует каналы общей памяти. Для процессов a и b создаются два канала (области общей памяти) - один канал используется в качестве «выхода» из a и «ввода» в b и другие наоборот.
Когда каналы связи созданы, обязательно, чтобы процесс a имел R / W доступ к своему соответствующему «выходному» каналу и только R доступ к своему соответствующему «входному» каналу. Другие процессы не должны иметь возможность получать W-доступ к каналам, совместно используемым другими парами процессов (предпочтительно, они не должны даже иметь R-доступ).
Какое решение вы можете предложить?
Я думал о:
- определение моих собственных системных вызовов (на данный момент не желательно)
- использование прав доступа к файлам, присущих файловой системе, для наложения этих прав доступа
Для второго решения идея состоит в том, чтобы запускать процессы под разными идентификаторами пользователей и использовать динамическое создание групп для каждой пары процессов и соответственно назначать права доступа к файлам для каждого дескриптора общей памяти (R для группы, R / W для процесса записи, - остальным).
Возможно ли второе решение? Есть ли лучшие решения (например, которые включают в себя некоторые системные вызовы, о которых я не знаю)?
Большое спасибо за ваше время и помощь.