Межпрограммное взаимодействие

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Аватара пользователя
Protopopulus
новенький
Сообщения: 24
Зарегистрирован: 25.11.2010 08:58:07

Межпрограммное взаимодействие

Сообщение Protopopulus »

Доброго всем вечера.

Имеется задача: надо организовать передачу типизированных данных между двумя одновременно работающими (в одной системе) программами. использовать модули типа Pipes, сокеты и сброс данных на диск крайне нежелательно. Нужен минимально возможный код.

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

У кого какие идеи по этому поводу? :)
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

В Linux - каналы, в Win - маленькие объёмы данных можно через семафоры передать.
Аватара пользователя
Protopopulus
новенький
Сообщения: 24
Зарегистрирован: 25.11.2010 08:58:07

Сообщение Protopopulus »

В Linux можно и DBus запользовать... Вот только задача состоит именно в том, чтобы сделать "канал", не прибегая к системным средствам, ибо кроссплатформенность. Да и объемы данных, судя по всему, будут исчисляться мегабайтами (b-деревья и FIFO), передаваться, естественно должен указатель. Вот ведь задачка! Уже всю голову сломал :(
Bupyc
постоялец
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Сообщение Bupyc »

Коллеги на предыдущей работе любили использовать для этих целей технологию CORBA.
Насколько мне известно, реализация есть для всего (Delphi, .Net, Linux).
Мне не известно есть ли что то для FPC, но вариант на мой взгляд интересный. Я бы к нему присмотрелся, если бы передо мной стояла подобная задача, т.к. пройдя весь путь один раз, далее проблема межпроцессного взаимодействия не возникает в принципе.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Для кроссплатформенности есть SimpleIPC. Судя по описанию, он односторонний и передаёт только строки, но теоретически можно с каждой стороны держать и сервер и клиент, а передаваемые данные кодировать/декодировать в строчки.
perlpunk
новенький
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Сообщение perlpunk »

http://www.freepascal.org/docs-html/rtl ... dex-5.html

не кроссплатформено работает разве?
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

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

Типичная "хакерская" задача :roll:
для windows
WriteProcessMemory
http://forum.sources.ru/index.php?showtopic=126162
http://msdn.microsoft.com/en-us/library/ms681674%28VS.85%29.aspx

для linux /proc/<Id>/mem прямой доступ к адресному пространству процесса + libc write/read
http://gentoo.theserverside.ru/book/processes_information.html

задавать адрес, по которому они смогли бы искать данные

для win7 (NT6.X) придется отключит рандомизацию адресного пространства (Address Space Layout Randomization, ASLR)
Аватара пользователя
Protopopulus
новенький
Сообщения: 24
Зарегистрирован: 25.11.2010 08:58:07

Сообщение Protopopulus »

Большое спасибо за полезные ссылки. Посмотрю насчет юнита IPC... Но вот вопрос, господа: есть ли возможность простыми способами, исключительно за счет модуля system, писать данные в ОЗУ по конкретному адресу несколькими процессами? Допустим, процесс "А" записывает что-то вроде:

Код: Выделить всё

var
   SomeVar: TSomeType;
   PSomeVar: ^SomeVar;

begin
   New(PSomeVar);
   PSomeVar^:=SomeVar;
   .....
   BlockWrite(SomeFile, PSomeVar, 1);
   .....

А процесс "Б" читает из файла этот указатель и считывает по нему данные...

Такое вообще возможно?
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Отображение файла на память
http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D0%BD%D0%B0_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C
Wibdows
для отображения файла в память используется функция CreateFileMapping...

http://www.intuit.ru/department/os/osmswin/9/3.html#sect16

linux mmap http://www.masters.donntu.edu.ua/2005/fvti/lukyanov/library/ipc/mmap.html
ЗЫ : должно что-то такое быть в fpc в питоне есть
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

А ещё в Linux можно писать обычный файл в tmpfs, она располагается в памяти. И даже в Windows есть что-то похожее, см. http://en.wikipedia.org/wiki/Tmpfs#Microsoft_Windows. Можно завернуть эти возможности в класс с раздельной реализацией для каждой платформы, и получить кроссплатформенный способ быстрого обмена данными сравнительно большого объёма.
Аватара пользователя
Protopopulus
новенький
Сообщения: 24
Зарегистрирован: 25.11.2010 08:58:07

Сообщение Protopopulus »

Odyssey, спасибо за интересную идею на счет tmpfs :wink: Действительно, очень просто работать с файлом, пусть и виртуальным... Единственное, что требуется - это установить SUID на исполняемый файл и присвоить права root.
grio
незнакомец
Сообщения: 1
Зарегистрирован: 25.01.2011 12:05:47

Сообщение grio »

Bupyc писал(а):Коллеги на предыдущей работе любили использовать для этих целей технологию CORBA.
Насколько мне известно, реализация есть для всего (Delphi, .Net, Linux)

-------------------------------------------------------------------------------------------------
"...Архитектура, основанная на компонентах, (CORBA, COM/DCOM) сняло часть проблем - снизило степень детализации и улучшило ситуацию с повторным использованием компонент. Компонентные технологии обеспечивали языки описания интерфейсов (к примеру, IDL) и средства для локального и удаленного вызова компонент.
Service Oriented Architecture (SOA) позволяет проектировать и создавать приложения, предоставляющие другим приложениям удаленно вызывать их методы через опубликованные интерфейсы, и возможность найти эти службы и описания интерфейсов..."
--------------------------------------------------------------------------------------------------
ВООБЩЕ, У MICROSOFT РЕШЕНЫ МНОГИЕ ПРОБЛЕМЫ МЕЖПРОГРАММНОГО СЕТЕВОГО ВЗАИМОДЕЙСТВИЯ, ТАКЖЕ И В ГЕТЕРОГЕННЫХ СРЕДАХ. В СЕРВЕРАХ EXCHANGE вы просто вибираете две гетерогенные среды (на экране справа/слева), из одной перетаскиваете данные в другую мышкой и прописываете/выбираете правило! все! данные будут пересылаться и перекодироваться по вашему правилу!
P.S. могу ошибиться с продуктом,или в BizTalk Server или в EXCHANGE я такое видел....давненько было....))
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

grio Это реклама конкретных продуктов и технологий незабвенных мелкомягких?
yantux
постоялец
Сообщения: 133
Зарегистрирован: 29.10.2007 15:02:33
Откуда: Санкт-Петербург
Контактная информация:

Сообщение yantux »

Кроммплатформенный api shared memory в паскале не реализова и не работает?
Bupyc
постоялец
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Сообщение Bupyc »

Mr.Smart писал(а):grio Это реклама конкретных продуктов и технологий незабвенных мелкомягких?


В описании корбы на википедии я не заметил упоминания о Microsoft. По-моему, это не их технология. Хотя, могу ошибаться.

yantux писал(а):Кроммплатформенный api shared memory в паскале не реализова и не работает?


Разделяемая память это, конечно, здорово, но корба позволяет по-человечески организовывать обработку данных в приложении-получателе. Т.е. не надо изобретать велосипед и придумывать каким образом синхронизироваться с отправителем.
Ответить