Рекомендация межпроцессного взаимодействия [закрывается]

9
задан Charles 9 December 2013 в 05:15
поделиться

5 ответов

Boost имеет прекрасную библиотеку InterProcess , которая является кроссплатформенной и довольно интуитивно понятной.

Я только поиграл с ней, так что могут быть лучшие альтернативы. .

Однако, если вам действительно не нужна разделяемая память, я бы придерживался подхода обмена сообщениями. Вы избежите тупиковых ситуаций и состояний гонки. Принцип канала действительно хорош, и он даже допускает ленивое поведение, которое может сэкономить вам много времени на обработку в зависимости от рассматриваемого вопроса!

6
ответ дан 4 December 2019 в 08:33
поделиться

A good choice is to use socketpair, very fast and efficient.

4
ответ дан 4 December 2019 в 08:33
поделиться

D-Bus довольно полезен и очень стабилен для выполнения ipc на одном и том же хосте. http://www.freedesktop.org/wiki/Software/dbus

2
ответ дан 4 December 2019 в 08:33
поделиться

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).

1
ответ дан 4 December 2019 в 08:33
поделиться

Как вы видели, вы можете использовать для межпроцессного взаимодействия:

  • Общая память
  • Именованные каналы
  • Сокеты TCP / UDP (возможно, локальные)

Общая память имеет преимущество производительности, потому что у вас нет буфера при отправке / получении сообщений. Но вы должны синхронизировать обмен данными с другим IPC. Это могут быть семафоры IPC или ... именованные каналы или сокеты.

Когда производительность не является основной целью, я предпочитаю сокеты, поскольку их использование простое и может быть расширено до межкомпьютерного взаимодействия.

Лучший способ - абстрагироваться от вашего взаимодействия с классом, который может использовать разделяемую память, когда два процесса находятся на одном компьютере, а в противном случае - сокеты. Затем вам нужно выбрать между UDP и TCP; -)

Для обмена синхронизацией / буфером предпочитайте TCP, поскольку он более надежен.

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

my2cents

РЕДАКТИРОВАТЬ:

Для синхронизации общая память, пожалуй, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)

my2cents

РЕДАКТИРОВАТЬ:

Для синхронизации общая память, возможно, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)

my2cents

РЕДАКТИРОВАТЬ:

Для синхронизации общая память, возможно, не лучший инструмент. В вашем случае его можно использовать, разделив небольшое пространство памяти с пространством для каждого процесса, который ожидает команд. Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и чтение общего пространства памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)

Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и считывающие общее пространство памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)

Вы можете запросить любую входящую команду или использовать общий семафор. Самый быстрый способ - это ваши процессы, ожидающие именованных семафоров и считывающие общее пространство памяти для своих команд / параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно быть таким быстрым? В любом случае абстрагируйтесь от этого класса, который моделирует ваш протокол обмена, и попробуйте два способа: -)

11
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: