|
|
  |
Вопрос ламера по Linux IPC, Inter Process Comminications |
|
|
|
Jan 13 2006, 20:33
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Есть два процесса под Linux. Им надо обмениваться пакетами данных. Пакет представляет из себя: * заголовок - поле фиксированной длины * данные - поле переменой длины (<= MAX_LEN), заполненное бинарными случайными данными. Как лучше всего сделать такой обмен? Я удумал следующее. 1. Канал. Пишем, читаем. Но поскольку он имеет байтный интерфейс, при последовательном чтении непонятно, где начинается заголовок. Значит, придется вводить какие-то механизмы для его нахождения (Escape последовательности и пр.). Это не сложно, но совершенно лишнее действие в контексте решаемой задачи (нужно ее решить максимально быстро по программированию, расход памяти и процессорного времени не важен (в разумных пределах)). 2. Разделяемая память. Наделать там кучу семафоров, и обмениться указателями на структуры. 3. Гибрид  Делаем разделяемую память, а там - кольцевой массив структур. Каждая структура - это сообщение, данные пакета аппроксимированы массивом максимальной длины (пустые места в памяти не волнуют). 2 потока для каждого направления обмена. Передающий процесс пишет в поток send_msg char значение номера элемента в массиве, куда он положил пакет. Принимающий процесс пишет в поток msg_ask char значение номера элемента в массиве, который он прочитал (освободил). IMHO, так еще будет быстрее всего (нет лишнего копирования) и экономнее (по памяти) всего (нет памяти для лишних копий). Вероятно, я изобретаю велосипед. А что скажут Гуру по данному поводу?
|
|
|
|
|
Jan 14 2006, 11:43
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
Если один процесс родительский, а второй его потомок - лучше использовать pipe. Если два независимых - то каналы FIFO. Кстати - каналы FIFO обеспечивают атомарные запись/чтение. Т.е. пакеты(кадры) не перемешиваются, в отличие например от передачи через TCP. Видимо это то что нужно. Для разделяемой памяти существует ограничение на количество блоков разделяемой памяти для процесса (что-то около 20, но это зависит от системы и ее настроек). Еще можно обмениваться через файлы, отображаемые в память. Лучшая книга - Уильям Стивенс Unix. Взаимодействие процессов Уильям Стивенс. Unix. Взаимодействие процессов
|
|
|
|
|
Jan 14 2006, 13:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(psL @ Jan 14 2006, 13:43)  Если один процесс родительский, а второй его потомок - лучше использовать pipe. Если два независимых - то FIFO. Кстати - FIFO обеспечивает атомарные запись/чтение. Т.е. пакеты(кадры) не перемешиваются, в отличие например от передачи через TCP. Видимо это то что нужно. ..... Еще можно обмениваться через файлы, отображаемые в память. 1. Pipe и FIFO суть одно и то-же и работают одинаково. И оба исключительно НЕ пакетные - не сохраняют границ сообщений (вспоминаем о чем речь шла). FIFO принадлежность System-V базирующихся систем и в линейке BSD не используются по причине нахренненужности. 2. Ну не надо сюда TCP приплетать и пугать "перемешиванием" путая его с повтором. 3. FIFO как раз и есть файл "отображаемый на память", как и сокет при адресации AF_UNIX.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 14 2006, 14:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(psL @ Jan 14 2006, 15:56)  > 1. Pipe и FIFO суть одно и то-же и работают одинаково. Не одно и то же, хотя бы с точки зрения того, что я говорил выше. Выше вы говорили, что: Цитата Кстати - каналы FIFO обеспечивают атомарные запись/чтение. Т.е. пакеты(кадры) не перемешиваются Продолжаю утверждать, что с этой точки зрения отличий Pipe и FIFO НЕТ НИКАКИХ. Цитата > И оба исключительно НЕ пакетные - не сохраняют границ сообщений (вспоминаем о чем речь шла). pipe возможно, насчет FIFO не уверен. Поскольку с FIFO могут работать и несколько процессов. ????? Цитата Разговор вроде был о Linux, а не о фрях. Речь идет о многочисленных последователей вышеупомянутых. BSD Socket предоставляет продуманный унифицированый интерфейс. По этой причине присутствует повсеместно, в отличие от FIFO. Цитата я имел ввиду, что TCP - не гарантирует сохранения границ пакетов. И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. Цитата С точки зрения реализации - наверное да, но все-таки это разные механизмы IPC. Что значит разные? Тогда уточите, что Вы понимаете под "можно обмениваться через файлы, отображаемые в память" и реализации сего действия.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 14 2006, 16:01
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
Цитата(zltigo @ Jan 14 2006, 17:53)  ????? Имелось ввиду что: Для канала дочерний процесс может получть дескриптор только от процесса родителя. Каналы не могут использоваться в качестве IPC между независимыми процессами. Очередь FIFO - отдельный тип файла в файловой системе, со всеми вытекающими. Не используются в BSD. Вообще, много чего разного, при похожести в первом приближении. Запись числа байтов, меньше емкости FIFO или канала гарантированно атомарна. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются. Если размер пакета больше емкости канала или FIFO - атомарность не гарантируется. Не верите - спросите у Робачевского и Ко.  Цитата Цитата я имел ввиду, что TCP - не гарантирует сохранения границ пакетов.
И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. В смысле прикладных пакетов, которые пользователь посылает. Подразумевалась вроде работа на прикоадном уровне? Прикладной уровень не всегда может забрать свой пакет полностью. Небольшим пакетам (по-моему до 8 КБ) это кстати не грозит - я же сказал пример неудачный. Цитата Цитата С точки зрения реализации - наверное да, но все-таки это разные механизмы IPC.
Что значит разные? Тогда уточите, что Вы понимаете под "можно обмениваться через файлы, отображаемые в память" и реализации сего действия. В nix вообще идеологически все построено на файлах. С этой точки зрения и каналы FIFO, и локальные сокеты, и совместно используемые "файлы, отображаемые в память" (ну не помню я как этот тип IPC правильно называется  ) суть одно и то же. Но есть тонкости, которые определяющие - Поэтому один механизм IPC называется так, а другой эдак. Кстати реализация BSD сокетов в каких либо облегченных версиях Linux тоже не совсем обязательно присутствует. Если я в чем-то и ошибаюсь - всему виной моя недостаточная осведомленность. Всех благ!
Сообщение отредактировал psL - Jan 15 2006, 09:45
|
|
|
|
|
Jan 14 2006, 20:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Harbour @ Jan 14 2006, 21:04)  Я так и не понял - процессы на одной машине ? В смысле нафига IPC заворачивать ? 1. За тем, что процессы изолированы во многих OC. 2. IPC для этого в OC и создаются, причем с учетом минимизации побочных эффектов. 3. Ну а в предложенной (к делу не относящейся реализации) рассчитывать на то, что DEADBEEF не встретится, и синхронизироваться ценой потери нескольких фреймов, конечно можно....., но радиолюбительство. Простейший надежный вариант формирования фрейма в байтовом потоке, например, в SLIP протоколе.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 15 2006, 06:23
|
Частый гость
 
Группа: Свой
Сообщений: 102
Регистрация: 11-10-04
Пользователь №: 849

|
Цитата я имел ввиду, что TCP - не гарантирует сохранения границ пакетов. И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. [quote] Я уже кучу денег заработал исправляя программы которые пользуются TCP/IP как пакетным протоколом. (Особенно wireless) Вот выдержка из RFC которая прямо об этом и предупреждает. ------------------------------------------ As for your second issue, please remember the admonition in RFC 1123: " 4.1.2.10 Telnet End-of-line Code: RFC-959, Page 34 " Implementors MUST NOT assume any correspondence between READ boundaries on the control connection and the Telnet EOL sequences (CR LF). " DISCUSSION: " Thus, a server-FTP (or User-FTP) must continue reading characters from the control connection until a complete Telnet EOL sequence is encountered, before processing the command (or response, respectively). Conversely, a single READ from the control connection may include more than one FTP command."
|
|
|
|
|
Jan 15 2006, 11:34
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(alexr22b @ Jan 15 2006, 08:23)  И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. Цитата Вот выдержка из RFC которая прямо об этом и предупреждает. 4.1.2.10 Telnet End-of-line Code: RFC-959, Page 34
Сначала к проблеме передачи пакета прицепили ни к селу ни к городу TCP/IP уровень, потом на него навернули Telnet протокол и его паковку байтов в пакеты.... Для кучи приплели радиоканал.... Перестаньте пожалуйста морочить голову.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|