LINUX.ORG.RU

Какой метод IPC лучше выбрать?


0

0

Граждане, поставьте на путь истинный начинающего программера!

Нужно между двумя демонами передавать данные нефиксированными порциями от нескольких десятков байт, до нескольких десятков мегабайт (точный объем не известен, вдруг юзверу взбредет в голову сделать что-нибудь вроде cat /dev/ad0).

Какой метод IPC лучше выбрать FIFO, shared memory, сообщения, сокеты или....?

anonymous

Ответ на: комментарий от anonymous

>sockets А чуть подробнее почему?

anonymous
()

Для больших объемов стратежнее использовать разделяемую память + сообщения

anonymous
()
Ответ на: комментарий от anonymous

Вопрос некашерный, конечно, но сколько байтов можно впихнуть в одно сообщение за раз, то же самое про сокеты? Понятно, что в разделяемую память немеряно.

anonymous
()
Ответ на: комментарий от anonymous

Похоже, что действительно поток....

anonymous
()

Вам ещё вариант:
1) берём OmniORB4, ORBit или MICO
2) пишем IDL наподобие этого:

interface MyDaemon {
    typedef sequence <byte> Packet;

    void begin ();
    void packet (in Packet packet);
    void end ();
};

3) делаем реализацию
   (для такого интерфейса - что может быть проще?)

Всё работает, все довольны. Демоны общаются.
Можно даже пофантазировать со сложными схемами общения,
большим числов клиентов и т д.

http://omniorb.sourceforge.net/
http://www.gnome.org/projects/ORBit2/
http://omg.org

erDiZz
()
Ответ на: комментарий от erDiZz

они самые - муравьи. Орбит точно не подойдет :)

anonymous
()
Ответ на: комментарий от anonymous

> Для больших объемов стратежнее использовать разделяемую память + сообщения

Для действительно больших объёмов - файлы.

execve
()
Ответ на: комментарий от erDiZz

erDiZz прав на 100%..
по хорошему сложно-сочинённые отношения процессов 
надо делать на CORBA..
Это вообще правильный подход и целиком и полностью unix-way

MKuznetsov ★★★★★
()
Ответ на: комментарий от r_asian

А mkfifo() со всеми вытекающими не будет замедлять I/O. Всеж это структура файловой системы, или нет?

anonymous
()
Ответ на: комментарий от bizon_art

ORBIT точно не подойдет, поскольку это слишком громоздкая вещь (на мой взгляд непрофессионального программера). А моя цель - компактная, по возможности быстрая и нетребовательная к ресурсам утилита, написаная на С. Поэтому, я и ищу среди классических решений.

anonymous
()

Че мозги человеку парите...

Если все в пределах одного хоста и в планах нету размазывать шнягу по сетке - однозначно пайпы, быстрее чем сокет и проще. Разделяемая память ище быстрее, но с пайпом проще работать, меньше проблем. Ничего не тормозит, создаешь mkfifo-й вначале два пайпа в /tmp/ или ище где, через один гонишь данные в одну сторону, через другой в другую.

Если есть (может возникнуть) необходимость разнесения по разным хостам, тогда сокеты. Реализцию на пайпах при необходимости несложно переделать на сокеты (или настроить NFS и оставить все на пайпах - но это будет муйня).

Для драфта я б брал пайпы и не мучался - пайп создать одлна строка, сокет поднять и следить и за евойными ошибками... это несколько сложнее.

AIv ★★★★★
()
Ответ на: комментарий от anonymous

> А mkfifo() со всеми вытекающими не будет замедлять I/O. Всеж это структура файловой системы, или нет?

Мож и замедляет. Я как-то передавал данные от драйвера платы L-783 к приложению, которое это все добро обрабатывало. 3 канала по 1 МГц 12 разрядного АЦП шли пормально.

r_asian ★☆☆
()
Ответ на: комментарий от AIv

> Если все в пределах одного хоста и в планах нету размазывать шнягу по сетке - однозначно пайпы, быстрее чем сокет и проще. Разделяемая память ище быстрее, но с пайпом проще работать, меньше проблем. Ничего не тормозит, создаешь mkfifo-й вначале два пайпа в /tmp/ или ище где, через один гонишь данные в одну сторону, через другой в другую.

Поддерживаю полностью.


r_asian ★☆☆
()
Ответ на: комментарий от AIv

Работать с сокетами сложнее, и следить за ошибками тоже сложнее, но это, по крайней мере, возможно. А у пайпа не особенно поймешь, что происходит. Один SIGPIPE чего стоит ...

Каналы - очень простой механизм для очень простых применений.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.