Титла: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 15, 2011, 21:44 Търсих в интернет но не намирих отговор
Може ли С++ функция от демон А да извика функция в демон Б и с извикването да се предадат аргументи. Функцията в демон Б да обработи аргументите и да върне резултат на демон А? Възможна ли е такава директна комуникация? Титла: Re: комуникация между 2 демона в линукс Публикувано от: n00b в Jan 15, 2011, 22:18 ДА - RPC му е мамата.
Титла: Re: комуникация между 2 демона в линукс Публикувано от: laskov в Jan 15, 2011, 22:36 А може би също и socket -и
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 15, 2011, 22:38 С това не се ли само праща съобщение?
п.п. Демоните работят на един сървър За RPC се сещам само че може да се ползва XML-RPC Титла: Re: комуникация между 2 демона в линукс Публикувано от: n00b в Jan 15, 2011, 23:06 XML-RPC е някаква чалга, ама не е същото. Общо взето се пакетира в XML и се изпраща по HTTP.
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 15, 2011, 23:17 На мен ми трябва да направя комуникация между демони работещи на един сървър
Титла: Re: комуникация между 2 демона в линукс Публикувано от: laskov в Jan 15, 2011, 23:35 Пример: clamd е демон на антивирусната програма ClamAV и създава сокет (във файловата система), напр. /var/run/clamav/clamd.socket
MailScanner праща на този сокет дали цялото писмо или име на директория, където то се намира, не знам, но получава информация от clamd дали писмото е заразено и ако да, с кой вирус. Титла: Re: комуникация между 2 демона в линукс Публикувано от: gat3way в Jan 15, 2011, 23:59 IPC механизми има много. По-скоро кажи кои са ти изискванията:
* трябва ли демоните да са на един и същ хост? * има ли вариант един процес да пише, много да четат или е peer-to-peer? * готов ли си да жертваш удобство за производителност или обратното? * приемливо ли е да ти се загубят съобщенията когато едната от страните я няма или не? * доколко държиш на сигурността? * доколко държиш на portability-то на цялата схема? * трябва ли това да може да се scale-ва и в един момент да трябва и други процеси да си комуникират по същият начин? От това следва и отговора. Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 00:10 Ето какво искам да постигна:
Искам да напиша приложение на C++ разделено на модули и едно ядро Всеки модул и ядрото е отделен процес в линукс Ядрото ще служи за комуникация между модулите но може това да отпадне. Трябва ми начин C++ функция в модул А да може да вика функция в модул Б и да дава аргументи. Функцията в модул Б трябва да връща отговор. Пример: Модул А трябва да вземе общ брой на потребители в база данни. Модул Б служи за комуникация с базата данни. Модул А извиква функция в модул Б и дава аргумент all_users. Функцията в модул Б се извиква и се свързва с базата данни. Прави операцията и връща като резултат ат повикването на модул А броя потребители. Има ли някакъв удобен IPC механизъм за това? * трябва ли демоните да са на един и същ хост? да * има ли вариант един процес да пише, много да четат или е peer-to-peer? без значиние * готов ли си да жертваш удобство за производителност или обратното? без значиние * приемливо ли е да ти се загубят съобщенията когато едната от страните я няма или не? без значиние * доколко държиш на сигурността? без значиние * доколко държиш на portability-то на цялата схема? само на centos 64-bit ще бъде * трябва ли това да може да се scale-ва и в един момент да трябва и други процеси да си комуникират по същият начин? без значиние Титла: Re: комуникация между 2 демона в линукс Публикувано от: gat3way в Jan 16, 2011, 00:21 В такъв случай най-подходящи ми се виждат два варианта: или unix domain socket-и или shared memory. Наготово обаче няма да стане, трябва да си напишеш класове и съответните функции които се грижат за тези неща. Аз бих предпочел UDS-ите, малко по-малко разправии с глупости (на цената на малко по-кофти производителност).
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 00:30 как през shared memory ще извикаш клас, ще му дадеш аргументи и той съответно ще ти върте резултат?
Титла: Re: комуникация между 2 демона в линукс Публикувано от: gat3way в Jan 16, 2011, 00:45 Не можеш. Обаче можеш да организираш нещата така че евентуално при наличието на нещо в shared memory-то да се вика някаква функция, която връща някакъв резултат някъде там в shared memory-то. Няма начин един процес ей така да извика някакъв метод от някакъв клас от друг процес. C++ не е дизайн-ван по такъв начин. За това казах, трябва да се погрижиш. Примерно вдигаш една нишка, която цикли и периодично чете нещо от споделената памет, при определени неща там, прави нещо определено и така.
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 01:04 Ами ако се предава един голам XML файл с команди какво трябва модула да направи?
Титла: Re: комуникация между 2 демона в линукс Публикувано от: gat3way в Jan 16, 2011, 01:12 Ако ти се парсват XML-и :) Траспортният механизъм няма толкова значение, можеш спокойно XML-а да го пратиш по unix domain socket-а, можеш да го запишеш в shared memory-то (там определено ще си имаш повече драми и сигурно ще трябва да ползваш семафори или нещо подобно за да си сигурен че никой не чете докато пишеш). Наготово няма как един процес да викне функция от друг процес, няма такъв механизъм на ниско ниво. Да, сигурно джавистите с техните rmi глупости ще се радват да кажат нещо по въпроса, само дето те си живеят в някакъв техен свят където това им е даденост и грам не се замислят, че операционната система няма някакви готови механизми, които да им го правят и това става на цената на разни (далеч не винаги оптимални) операции.
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 01:24 Значи май XML остава еднствен вариант за голямо количество информация.
Ще може много команди да се зададът към модула едновременно и много отговори да се предадът. Би ли разказал ако си правил някой интересен модулен проект на C++ как си го структурирал Титла: Re: комуникация между 2 демона в линукс Публикувано от: gat3way в Jan 16, 2011, 01:29 XML-а просто описва (евентуално) голямо количество информация. Не е начин да предадеш въпросното количество информация. Ако ти е по-удобно да го ползваш - ОК. Аз лично мразя XML, защото се парсва трудно и защото е голямо разхищение. Обаче ако ти е най-лесно да го ползваш, няма проблеми, има и доста библиотеки за парсване на XML-и. Сега вече дали въпросният XML ще го засилиш по unix domain socket, дали ще го пишеш в shared memory, дали ще го пращаш по mqueue, сокет или pipe, няма значение.
П.П на този въпрос, аз не съм човекът, който да ти даде добър отговор. Питай някой C++ програмист с опит в абстрактното мислене. Аз съм тъп и искам просто вход и изход и се опитвам да дам оптималния път между двете :) Титла: Re: комуникация между 2 демона в линукс Публикувано от: romeo_ninov в Jan 16, 2011, 08:34 Значи май XML остава еднствен вариант за голямо количество информация.Не, има (разпространени) три метода: RPC, ORB и webservice - нещата не са като да щракаш с пръсти, иска се работа и писане. През shared memory/ semaphores може да се организира подобни нещо, но в границите н една машина ....според мен въпроса не е програмистки, а архитектурен :) Титла: Re: комуникация между 2 демона в линукс Публикувано от: Nedko Arnaudov в Jan 16, 2011, 13:08 http://en.wikipedia.org/wiki/D-Bus
Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 15:26 Би ли обяснил съвсем на кратко в кои случаи какво се палзва и как се ползва
RPC, ORB и webservice Титла: Re: комуникация между 2 демона в линукс Публикувано от: n00b в Jan 16, 2011, 16:17 RPC можеш да направиш лесно с libevent:
http://monkey.org/~provos/libevent/doxygen-1.4.10/ Цитат libevent is an event notification library for developing scalable network servers. The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. Цитат libevents provides a framework for creating RPC servers and clients. It takes care of marshaling and unmarshaling all data structures. Явно водите ще са ти дълбоки. Ако ще правиш socket сам ще трябва да нагласиш кода за маршализиране и демаршализиране на структурите и останалото... Титла: Re: комуникация между 2 демона в линукс Публикувано от: rcbandit в Jan 16, 2011, 21:25 Май ще си реша проблема като ползвам message queue изпращайки данни в някакъв формат например XML.
Имате ли наблюдение кой формат изисква най-малко ресурси за конвертиране и е най-малък. Спрял съм се за сега на JSON. |