Как общаться между двумя процессами - PullRequest
2 голосов
/ 12 марта 2012

Привет! Я работаю над проектом c ++, в котором я пытаюсь сохранить независимость от ОС, и у меня есть два процесса, которые должны взаимодействовать.Я думал о настройке 3-го процесса (возможно, в качестве службы?) Для координации двух других асинхронно.

Клиент 1 сообщит промежуточному процессу, когда данные будут готовы, и отправит данные ему.Затем промежуточный процесс будет хранить эти данные до тех пор, пока клиент 2 не скажет ему, что он готов к данным.Если промежуточный процесс не получил новые данные от клиента 1, он скажет клиенту 2 подождать.

Поскольку я пытаюсь сохранить независимость этой ОС, я не знаю, что использовать.Я изучал использование MPI, но он не совсем подходит для этой цели.Я также изучил Boost.ASIO, Named Pipes, RPC и RCF.В настоящее время я занимаюсь программированием в Windows, но я бы хотел избежать использования WIN_API, чтобы код потенциально мог быть скомпилирован в Linux.

Вот немного подробнее о двух процессах.

У нас есть внутренний процесс / модель (клиент 1), который будет получать начальные входные данные от GUI (клиент 2, написанный на Qt) через промежуточный процесс.Затем модель продолжит работу до тех пор, пока не будет выполнено конечное условие, и отправит данные на сервер по мере готовности.GUI будет запрашивать промежуточный процесс для получения данных через регулярные промежутки времени, и ему будет предложено подождать, если модель не обновит данные.Поскольку данные становятся доступными из модели, мы также хотим иметь возможность сохранять любые предыдущие данные из текущего сеанса для экспорта в файл, если пользователь решит это сделать (т. Е. Мы хотим, чтобы графический интерфейс пользователя выдавал командуинтерфейс для экспорта (или загрузки) данных).

Мои привилегии модификации задней части / модели минимальны, кроме как придерживаться дизайна, изложенного выше.У меня приличный опыт работы с c ++, но не так много параллельных / асинхронных приложений.Любая помощь или направление с благодарностью.

Ответы [ 3 ]

1 голос
/ 12 марта 2012

Я бы посмотрел библиотеку boost.interprocess . Если два процесса находятся на одной и той же машине, у них есть несколько разных способов взаимодействия между процессами, и это происходит независимо от платформы.

1 голос
/ 12 марта 2012

Стандартный сокет BSD TCP / IP в основном не зависит от платформы.Они работают с некоторыми небольшими отличиями как в Windows, так и в Unices (например, в Linux).

Windows не поддерживает сокеты AF_UNIX.

0 голосов
/ 12 марта 2012

Я не уверен, рассматривали ли вы систему обмена сообщениями, но если вы отправляете структурированные данные между процессами, вам следует рассмотреть возможность просмотра буферов протокола Google.

Они относятся к содержанию сообщений (что передается), а не к тому, как они передаются.

boost :: asio не зависит от платформы, хотя это не подразумевает C ++ с обеих сторон. Конечно, когда вы используете C ++, вы можете использовать boost :: asio в качестве своего вида транспорта.

...