Страница 1 из 2

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

СообщениеДобавлено: 28.11.2010 00:57:22
Protopopulus
Доброго всем вечера.

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

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

У кого какие идеи по этому поводу? :)

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

СообщениеДобавлено: 28.11.2010 11:20:20
Nik
В Linux - каналы, в Win - маленькие объёмы данных можно через семафоры передать.

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

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

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

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

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

СообщениеДобавлено: 28.11.2010 12:20:03
Odyssey
Для кроссплатформенности есть SimpleIPC. Судя по описанию, он односторонний и передаёт только строки, но теоретически можно с каждой стороны держать и сервер и клиент, а передаваемые данные кодировать/декодировать в строчки.

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

СообщениеДобавлено: 28.11.2010 14:18:07
perlpunk
http://www.freepascal.org/docs-html/rtl ... dex-5.html

не кроссплатформено работает разве?

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

СообщениеДобавлено: 28.11.2010 16:05:51
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)

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

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

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

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

Такое вообще возможно?

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

СообщениеДобавлено: 29.11.2010 01:01:13
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 в питоне есть

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

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

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

СообщениеДобавлено: 29.11.2010 23:48:26
Protopopulus
Odyssey, спасибо за интересную идею на счет tmpfs :wink: Действительно, очень просто работать с файлом, пусть и виртуальным... Единственное, что требуется - это установить SUID на исполняемый файл и присвоить права root.

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

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

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

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

СообщениеДобавлено: 25.01.2011 13:31:30
Mr.Smart
grio Это реклама конкретных продуктов и технологий незабвенных мелкомягких?

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

СообщениеДобавлено: 25.01.2011 23:35:47
yantux
Кроммплатформенный api shared memory в паскале не реализова и не работает?

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

СообщениеДобавлено: 26.01.2011 00:04:35
Bupyc
Mr.Smart писал(а):grio Это реклама конкретных продуктов и технологий незабвенных мелкомягких?


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

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


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