C ++: наиболее распространенный способ общения с одним приложением из другого - PullRequest
3 голосов
/ 17 марта 2010

В общих чертах, у меня есть приложение, которое просматривает каталоги при запуске и создает индекс специальных файлов - после этого оно работает как демон. Другое приложение создает такие «специальные» файлы и помещает их в какой-то каталог. Какой способ информирования первого приложения о новом файле (для его индексации) является наиболее распространенным, простым (первый - во время выполнения, поэтому его не следует сильно замедлять) и кросс-платформенным, если это возможно

Я просматривал RPC и IPC, но они слишком тяжелые (также не кроссплатформенные и медленные (нужно много функций для работы - мне нужен простой и хорошо работающий способ), вероятно). *

Ответы [ 6 ]

7 голосов
/ 17 марта 2010

Трубы могут быть одним из вариантов: см. Сетевое программирование с использованием труб и удаленных вызовов процедур (Windows) или Создание каналов в C (Unix).

Я давно этого не делал, но из своего опыта работы с RPC, DCOM, COM, .NET Remoting и программированием сокетов, я думаю, что pipe - самый простой и эффективный вариант.

1 голос
/ 17 марта 2010

eisbaw предложил TCP. Я бы сказал, чтобы сделать это еще проще, используйте UDP. Создайте поток прослушивания, который будет принимать пакеты, и обрабатывать его оттуда - во всех приложениях.

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

Каждому экземпляру приложения потребуется специальный порт, но его легко настроить с помощью файлов конфигурации, которые у вас (я полагаю) уже есть.

Будьте проще (:

1 голос
/ 17 марта 2010

Для Windows (NTFS) вы можете получить уведомление от ОС, что каталог был изменен. Но это не кросспл. а не о двух приложениях.

«МПК, но они слишком тяжелые» - нет, они совсем не тяжелые. Вы должны взглянуть на именованные каналы - этот IPC самый быстрый, и он похож на Win / Unix с небольшими отличиями. Или розетки!

0 голосов
/ 17 марта 2010

файлы, отображаемые в память, сокеты и именованные каналы - все это высокоэффективные кроссплатформенные механизмы ipc. Что ж, apis для доступа к именованным каналам и файлам, отображаемым в памяти, различаются в POSIX и Win32, но основные механизмы достаточно схожи, так что легко создать кроссплатформенную оболочку. Сокеты и именованные каналы имеют тенденцию быть быстрыми, потому что в межпроцессных ситуациях разработчики ОС (из наиболее распространенных ОС) имеют встроенные ярлыки, которые по существу заставляют сокет / именованный канал писать довольно простую оболочку раздела памяти.

0 голосов
/ 17 марта 2010

Как отметил Андрей, если вы заранее договорились о полном пути, вы можете просто указать ОС, когда она будет добавлена. Все основные платформы фактически поддерживают это в той или иной форме. Для этого вы можете использовать кроссплатформенную библиотеку, например QFileSystemWatcher .

РЕДАКТИРОВАТЬ: Я не думаю, что QFileSystemWatcher приведет к слишком большой потере производительности. Он определенно полагается на базовую ОС для уведомлений в Linux, FreeBSD и Mac OS (и я думаю, что Windows). Смотри http://qtnode.net/wiki/QFileSystemWatcher

0 голосов
/ 17 марта 2010

Локальные TCP-сокеты гарантированно работают - как уже упоминал Андрей

Совместно используемая память будет еще одним вариантом, посмотрите на http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2006 / n2044.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...