Evgeny_CD (13.01.2006 23:23, просмотров: 2802)
Вопрос ламера по Linux IPC (Inter Process Comminications) Есть два процесса под Linux. Им надо обмениваться пакетами данных.
Пакет представляет из себя:
* заголовок - поле фиксированной длины
* данные - поле переменой длины (меньше [почему форум в этом месте обрезает левую угловую скобку???] MAX_LEN), заполненное бинарными
случайными данными.
Как лучше всего сделать такой обмен?
Я удумал следующее.
1. Канал. Пишем, читаем. Но поскольку он имеет байтный интерфейс, при
последовательном чтении непонятно, где начинается заголовок. Значит,
придется вводить какие-то механизмы для его нахождения (Escape
последовательности и пр.). Это не сложно, но совершенно лишнее действие
в контексте решаемой задачи (нужно ее решить максимально быстро по
программированию, расход памяти и процессорного времени не важен (в
разумных пределах)).
2. Разделяемая память. Наделать там кучу семафоров, и обмениться
указателями на структуры.
3. Гибрид :)
Делаем разделяемую память, а там - кольцевой массив структур. Каждая
структура - это сообщение, данные пакета аппроксимированы массивом
максимальной длины (пустые места в памяти не волнуют).
2 потока для каждого направления обмена.
Передающий процесс пишет в поток send_msg char значение номера
элемента в массиве, куда он положил пакет.
Принимающий процесс пишет в поток msg_ask char значение номера элемента в
массиве, который он прочитал (освободил).
IMHO, так еще будет быстрее всего (нет лишнего копирования) и
экономнее (по памяти) всего (нет памяти для лишних копий).
Вероятно, я изобретаю велосипед. А что скажут Гуру по данному поводу?