Boost имеет прекрасную библиотеку InterProcess , которая является кроссплатформенной и довольно интуитивно понятной.
Я только поиграл с ней, так что могут быть лучшие альтернативы. .
Однако, если вам действительно не нужна разделяемая память, я бы придерживался подхода обмена сообщениями. Вы избежите тупиковых ситуаций и состояний гонки. Принцип канала действительно хорош, и он даже допускает ленивое поведение, которое может сэкономить вам много времени на обработку в зависимости от рассматриваемого вопроса!
A good choice is to use socketpair, very fast and efficient.
D-Bus довольно полезен и очень стабилен для выполнения ipc на одном и том же хосте. http://www.freedesktop.org/wiki/Software/dbus
I'd use unix sockets, or some library which wraps them. Unix sockets are pretty easy to use.
On the other hand if you have fixed-size status information to report back, you could just have the child processes write it into a file (presumably it's small and you won't fsync it, so it won't generate significant IO workload).
Как вы видели, вы можете использовать для межпроцессного взаимодействия:
Общая память имеет преимущество производительности, потому что у вас нет буфера при отправке / получении сообщений. Но вы должны синхронизировать обмен данными с другим IPC. Это могут быть семафоры IPC или ... именованные каналы или сокеты.
Когда производительность не является основной целью, я предпочитаю сокеты, поскольку их использование простое и может быть расширено до межкомпьютерного взаимодействия.
Лучший способ - абстрагироваться от вашего взаимодействия с классом, который может использовать разделяемую память, когда два процесса находятся на одном компьютере, а в противном случае - сокеты. Затем вам нужно выбрать между UDP и TCP; -)
Для обмена синхронизацией / буфером предпочитайте TCP, поскольку он более надежен.
Я не использую именованные каналы, так как предпочитаю сокеты для возможности использования межкомпьютерной связи и, конечно же, вы можете найти множество переносимых библиотек сокетов ...
my2cents
РЕДАКТИРОВАТЬ:
Для синхронизации общая память, пожалуй, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)
my2cents
РЕДАКТИРОВАТЬ:
Для синхронизации общая память, возможно, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)
my2cents
РЕДАКТИРОВАТЬ:
Для синхронизации общая память, возможно, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)
Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и считывающие общее пространство памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -) Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и считывающие общее пространство памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)