Обмен состояниями между процессами в разных сетевых пространствах имен
Обновление вопроса с дополнительной информацией:
У меня 32 сетевых пространства имен на Linux Ubuntu 14.04, и в каждом пространстве имен запускается программа на языке Си. Я хочу, чтобы программа могла делиться некоторыми данными со своими братьями и сестрами в других пространствах имен (не потоки, отдельные процессы). Как это может быть сделано? Я не могу выполнить многоадресную передачу UDP, так как каждое пространство имен имеет свой собственный сетевой стек, а пакеты, отправленные в домен многоадресной рассылки, не видны другим пространствам имен. Я не могу думать о том, чтобы сделать это чисто с помощью памяти mmap.
С помощью mmap() каждый процесс может попытаться выполнить запись на карту одновременно. Кроме того, когда один процесс пишет, другие должны иметь возможность выяснить это и обновить свою структуру данных этим новым контентом. Им разрешается писать, как только каждый процесс узнает об этом предыдущем обновлении. Вот почему я впервые подумал об использовании сокета UDP Multicast для связи, он очень хорошо работает для 32 процессов, но они должны находиться в одном пространстве имен.
Кроме того, сокет домена Unix, насколько я понимаю, не позволяет работать нескольким читателям / писателям.
Цени любую помощь!
1 ответ
32 процесса в 32 пространствах сетевых имен уже довольно значительны, так что я думаю, вы хотите что-то серьезное, и это может масштабироваться. Тогда я бы посоветовал вам использовать современную и масштабируемую систему Linux IPC.
Или
d-bus
,или же
netlink sockets
(которые не ограничиваются сетевыми вещами и не будут мешать вашим пространствам имен, если вы этого не хотите). Смотрите здесь: "Протокол netlink - это механизм IPC на основе сокетов, используемый для связи [...] между самими процессами в пользовательском пространстве".
Это, безусловно, более тяжелая инфраструктура (с точки зрения работы по разработке программного обеспечения) по сравнению со старой школой IPC, такая как общая память, но вы получите следующие преимущества:
регистрация на мероприятия,
одноадресная / многоадресная / широковещательная связь между вашими процессами,
и намного меньше проблем с состоянием гонки.
РЕДАКТИРОВАТЬ:
Здесь чувствуется тенденция к "да, это можно сделать с помощью обычного Unix IPC".
И да, конечно, это можно сделать. Это сделано. Для вдохновения вы, возможно, захотите взглянуть на проект системы свойств Android, который основан на простой общей памяти и, кажется, довольно успешен и масштабируем, не так ли? (и у вас даже есть исходный код под либеральной лицензией для изучения и разветвления - я использую его на встраиваемых продуктах, отличных от Android).