Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сообщение между модулями, нужен способ эффективного взаимодействия 
:(
    Опции темы
tzirechnoy
Дата 11.11.2014, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
как это должно помочь в моем вопросе?


Тебе не потребуется вообще ничего объявлять для использующего её класса. Ни глобальных объектов, ни локальных, и дажэ думать над окончательным списком полей, изменение которого сломало бы бинарную совместимость.


PM MAIL   Вверх
fish9370
Дата 11.11.2014, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(tzirechnoy @  11.11.2014,  00:08 Найти цитируемый пост)
Тебе не потребуется вообще ничего объявлять для использующего её класса. Ни глобальных объектов, ни локальных, и дажэ думать над окончательным списком полей, изменение которого сломало бы бинарную совместимость.


а пример можно?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
svlary
Дата 11.11.2014, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(fish9370 @  10.11.2014,  21:26 Найти цитируемый пост)
разница, между передачей данных через IPC и напрямую существенна. Нужно ли это объяснять?


Не обязательно! smile
Через IPC - проверено и надёжно.
Напрямую - деревянный велосипед на треугольных колёсах.

Это моё убеждение. Я не призываю Вас следовать ему... -)

Добавлено через 7 минут и 20 секунд
Цитата(fish9370 @  10.11.2014,  21:26 Найти цитируемый пост)
линукуется динамически


Весьма абстрактный ответ...
Так как Вы не ответили на третий мой пункт:
Цитата
Строчки из make-файла, в которых компиллируются и линкуются эти два объектных (so) файла.

то у меня возникло подозрение, что Вы просто забыли задать линкеру ключик -l (или -L)
задающий эти самые so-шки. 

Я ошибаюсь ?

PM MAIL   Вверх
fish9370
Дата 11.11.2014, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(svlary @  11.11.2014,  13:02 Найти цитируемый пост)
Через IPC - проверено и надёжно.
Напрямую - деревянный велосипед на треугольных колёсах.


проверено, надежно, но для другой задачи. 

IPC подразумевает, копирование в ядро, затем передачу (копирование обратно в юзерсейс), потом снова копирование уже в требуемую структуру. При этом занимаются ресурсы ядра

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


Цитата(svlary @  11.11.2014,  13:02 Найти цитируемый пост)
то у меня возникло подозрение, что Вы просто забыли задать линкеру ключик -l (или -L)
задающий эти самые so-шки. 

Я ошибаюсь ?


мне не совсем понятен вопрос, -l там не требуется, так как линковки с данными so-шками нет (линк происходит динамически). Модули прекрасно собираются, и работают

Код

CFLAGS = -fPIC -ggdb -D__BS_DEBUG_MALLOC
INCLUDES = -I. -I../../include
SOURCES = ../../src/
UTILS = $(SOURCES)utils/
LIBEDIT = $(SOURCES)libedit
EL_SRC = $(LIBEDIT)/src/
EL_INCLUDES = -I$(LIBEDIT) -I$(EL_SRC)
CC = gcc

shared-A:
        $(DEBUG)echo "Compiling ..."; \
        VERSION="0.1"; \
        PROGRAM="shared-object-A.c"; \
        OUT="shared-A.so"; \
        REVISION="`svn info $${PROGRAM} | grep 'Last Changed Rev:' | awk '{print $$4;}'`"; \
        if test "x$${REVISION}" = "x"; then REVISION="devel"; fi; \
        $(CC) $(INCLUDES) $(EL_INCLUDES) $(CFLAGS) -DVERSION=\"$${VERSION}.$${REVISION}\" -DMODULE_NAME=\"$${OUT}\" \
         -Wall $(SOURCES)logger.c $${PROGRAM} -DBS_CLI -shared \
        -o $${OUT}; \
        echo "    [$${PROGRAM} $${VERSION}.$${REVISION}] $${OUT}"



Это сообщение отредактировал(а) fish9370 - 11.11.2014, 16:53


--------------------
undefined
PM MAIL WWW ICQ   Вверх
svlary
Дата 11.11.2014, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(fish9370 @  11.11.2014,  16:35 Найти цитируемый пост)
линковки с данными so-шками нет (линк происходит динамически). 


Линковка двух взаимодействующих модулей происходит ВСЕГДА.  Иначе они не смогут взаимодействовать. 
Но эта линковка может быть двух типов:
  • Статическая, когда все взаимодействующие модули собираются в одну кучу и все линки настраиваются заранее.
  • Динамическая, когда в исполняемом модуле остаются неразрешённые ссылки, которые настраиваются по мере необходимости.

Во втором случае программа, настраивающая неразрешённые ссылки (Динамический линкер) должна знать, ГДЕ искать эти самые точки, на которые нужно настроить неразрешённые ссылки. so-шки линкуются динаически. Поэтому, линкер должен знать, в какой so-шке какие точки входа наличествуют.

Поэтому, динамический компоновщик Linux ведёт хэш точек входа во все известные ему so-шки. Что бы такой хэш можно было обновлять, установлено соглашение, что все so-шки располагаются в
  • /lib
  • /usr/lib
  • /usr/local/lib

Команда

Код

ldconfig


заставляет линкер перестроить его хэш.

Если so-шка расположена НЕ в стандартном месте, то её расположение должно быть задано явно, с помощью ключей -l или
-L.
PM MAIL   Вверх
xvr
Дата 12.11.2014, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  11.11.2014,  20:55 Найти цитируемый пост)
Если so-шка расположена НЕ в стандартном месте, то её расположение должно быть задано явно, с помощью ключей -l или
-L. 

Не совсем так. Для задания нестандартного места для so в run-time используется ключ -rpath (или переменная окружения LD_LIBRARY_PATH). А ключи -i и -L используются на этапе линковки, что бы линкер вообще был в курсе, что при запуске программы нужно загружать данные so'ки, ну и что в них надо искать неразрешенные до сих пор имена.

Цитата(fish9370 @  11.11.2014,  16:35 Найти цитируемый пост)
мне не совсем понятен вопрос, -l там не требуется, так как линковки с данными so-шками нет (линк происходит динамически).

Как раз нужно, что бы загружаемый модуль знал, где искать extern struct hashtable users;

PM MAIL   Вверх
fish9370
Дата 12.11.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(svlary @  11.11.2014,  20:55 Найти цитируемый пост)
Линковка двух взаимодействующих модулей происходит ВСЕГДА.  Иначе они не смогут взаимодействовать.


нет, Вы слишком категоричны. В моей практике, чаще всего так: имеется глобальный объект, допустим двунаправленный связанный список, который объявлен в ядре (ядре программы). Ядро грузит модуль (some-module.so) с помощью dlopen. Модуль при инициализации добавляет обработчики к этому глобальному списку. Последующие модули делают тоже самое. При этом непосредственно между собой модули не линкуются. А при необходимости выполнить код другого модуля, они обращаются к этому списку. В момент выгрузки, они удаляют свои обработчики из этого списка и на том их взаимодействие заканчивается.

Вы понимаете, что это совсем другая практика, нежели та, что указываете Вы?

пожалуйста, освежите знания man 3 dlopen

Код

void *dlopen(const char *filename, int flag);


Цитата(xvr @  12.11.2014,  09:41 Найти цитируемый пост)
Как раз нужно, что бы загружаемый модуль знал, где искать extern struct hashtable users;


как раз нужен ключ -l? -l я не использую, поймите же наконец



Это сообщение отредактировал(а) fish9370 - 12.11.2014, 11:47


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ihost
Дата 12.11.2014, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.9.2012

Репутация: нет
Всего: нет



Изначальная задача сформулирована не очень однозначно- все-таки на каком этапе необходимо получить связаывание объектов переменных- на раннем этапе при сборке исполняемого модуля, или же на позднем при осуществлении вызовов dl*()
Если речь идет о первом случае, то очевидно что Вы сразу должны указать целевую область связывания, объявить для нее локальный идентификатор псевдонима, а при запуске выставить корректный LD_LIBRARY_PATH
Если речь о втором случае, о каком именном псевдониме для связывания вообще можно говорить?! Подключили в процессе исполнения, забрали необходимый объект, сделали ссылку с учетом структуры - или же включили соответствующий .h-файл
Код

 void * f = dlopen ("shared_object_of_millenium.so", RTLD_NOW);
  void * obj = dlsym (f, "global_object_of_millenium");
  typedef struct { int a; float b;  } sharing_type; 
  sharing_type* myobj = (sharing_type*)obj;

Ах да и чтобы не пришлось лишний раз проводить незабываемые минуты веселья с demangler'ом, сделайте в исходном модуле такую штукенцию
Код

extern "C" sharing_type global_object_of_millenium = { ... }

PM MAIL   Вверх
fish9370
Дата 12.11.2014, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(Ihost @  12.11.2014,  13:13 Найти цитируемый пост)
Если речь о втором случае, о каком именном псевдониме для связывания вообще можно говорить?! Подключили в процессе исполнения, забрали необходимый объект, сделали ссылку с учетом структуры - или же включили соответствующий .h-файл


да, Вы правильно меня поняли

Цитата(Ihost @  12.11.2014,  13:13 Найти цитируемый пост)
void * obj = dlsym (f, "global_object_of_millenium");


вариант хороший, но так хотелось обойтись без этого

дело в том, что я не пользуюсь этой функцией, я отдал это на откуп самому модулю, который сам регистрирует общие объекты

а тут я вообще хотел на халяву, как-то автоматом связать


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 12.11.2014, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fish9370 @  12.11.2014,  11:36 Найти цитируемый пост)
как раз нужен ключ -l? -l я не использую, поймите же наконец

Это мы поняли, и поэтому у вас и происходит это -

Цитата(fish9370 @  8.11.2014,  22:48 Найти цитируемый пост)
вопрос по 4 пункту: используется динамическое связывание, модули подключаются во время исполнения программы, как сделать объект общим? Если я описываю, объект как extern при связывании линкер пишет undefined symbol,


И что бы этого не происходило, и надо подать в сборку модулей -l<router> (где librouter.so и содержит ваш struct hashtable users). Физически struct hashtable users останется там же, где и был (в  librouter.so), а в модулях появится только ссылка на него (в виде имени библиотеки) и связывание с его экспортируемыми символами.

PM MAIL   Вверх
fish9370
Дата 12.11.2014, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(xvr @  12.11.2014,  20:37 Найти цитируемый пост)
И что бы этого не происходило, и надо подать в сборку модулей -l<router> (где librouter.so и содержит ваш struct hashtable users). Физически struct hashtable users останется там же, где и был (в  librouter.so), а в модулях появится только ссылка на него (в виде имени библиотеки) и связывание с его экспортируемыми символами.


я вас понял, спасибо, возможно это поможет  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.