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

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

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

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

Сообщение Protopopulus » 28.11.2010 00:57:22

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

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

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

У кого какие идеи по этому поводу? :)
Аватара пользователя
Protopopulus
новенький
 
Сообщения: 24
Зарегистрирован: 25.11.2010 09:58:07

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

Сообщение Nik » 28.11.2010 11:20:20

В Linux - каналы, в Win - маленькие объёмы данных можно через семафоры передать.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Protopopulus » 28.11.2010 11:31:00

В Linux можно и DBus запользовать... Вот только задача состоит именно в том, чтобы сделать "канал", не прибегая к системным средствам, ибо кроссплатформенность. Да и объемы данных, судя по всему, будут исчисляться мегабайтами (b-деревья и FIFO), передаваться, естественно должен указатель. Вот ведь задачка! Уже всю голову сломал :(
Аватара пользователя
Protopopulus
новенький
 
Сообщения: 24
Зарегистрирован: 25.11.2010 09:58:07

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

Сообщение Bupyc » 28.11.2010 12:11:10

Коллеги на предыдущей работе любили использовать для этих целей технологию CORBA.
Насколько мне известно, реализация есть для всего (Delphi, .Net, Linux).
Мне не известно есть ли что то для FPC, но вариант на мой взгляд интересный. Я бы к нему присмотрелся, если бы передо мной стояла подобная задача, т.к. пройдя весь путь один раз, далее проблема межпроцессного взаимодействия не возникает в принципе.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

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

Сообщение Odyssey » 28.11.2010 12:20:03

Для кроссплатформенности есть SimpleIPC. Судя по описанию, он односторонний и передаёт только строки, но теоретически можно с каждой стороны держать и сервер и клиент, а передаваемые данные кодировать/декодировать в строчки.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

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

Сообщение perlpunk » 28.11.2010 14:18:07

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

не кроссплатформено работает разве?
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

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

Сообщение coyot.rush » 28.11.2010 16:05:51

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

Типичная "хакерская" задача :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)
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

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

Сообщение Protopopulus » 28.11.2010 23:18:51

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

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

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

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

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

Сообщение coyot.rush » 29.11.2010 01:01:13

Отображение файла на память
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 в питоне есть
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

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

Сообщение Odyssey » 29.11.2010 02:01:53

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

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

Сообщение Protopopulus » 29.11.2010 23:48:26

Odyssey, спасибо за интересную идею на счет tmpfs :wink: Действительно, очень просто работать с файлом, пусть и виртуальным... Единственное, что требуется - это установить SUID на исполняемый файл и присвоить права root.
Аватара пользователя
Protopopulus
новенький
 
Сообщения: 24
Зарегистрирован: 25.11.2010 09:58:07

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

Сообщение grio » 25.01.2011 13:16:56

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

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

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

Сообщение Mr.Smart » 25.01.2011 13:31:30

grio Это реклама конкретных продуктов и технологий незабвенных мелкомягких?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение yantux » 25.01.2011 23:35:47

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

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

Сообщение Bupyc » 26.01.2011 00:04:35

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


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

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


Разделяемая память это, конечно, здорово, но корба позволяет по-человечески организовывать обработку данных в приложении-получателе. Т.е. не надо изобретать велосипед и придумывать каким образом синхронизироваться с отправителем.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru