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

Поиск:

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


Опытный
**


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

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



Здравствуйте,

есть задача: 
1. принять сообщение
2. передать сообщение модулю по префиксу команды (к примеру команда monitor::update, где monitor - имя модуля, в котором находится обработчик, update - команда)
3. в заданном модуле произвести обработку, и асинхронно вернуть результат, в некоторую очередь в первом модуле

пояснение к задаче:
1) за прием и маршрутизацию команд отвечает модуль router
2) тестовый модуль, в котором будет обработчик назовем monitor
3) при загрузке модуль monitor регистрирует функцию обработчик в модуле router. Добавляет в список префиксов префикс 'monitor' - связка префикс-обработчик
4) очередь результатов, находится в модуле router и должна быть доступна всем прочим модулям

вопрос по 4 пункту: используется динамическое связывание, модули подключаются во время исполнения программы, как сделать объект общим? Если я описываю, объект как extern при связывании линкер пишет undefined symbol, если я не указываю extern создается локальная копия

обоснованная критика архитектуры приветствуется


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


Эксперт
****


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

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



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

Модуль router оформляется как librouter.so файл (с описанием объекта без каких либо префиксов в нем самом и с extern в соответствующем *.h файле) Главная программа линкуется с librouter.so, с ним же ликуются при компиляции все остальные загружаемые модули (они должны быть собраны в виде *.so файлов).
Тогда при загрузке этих *.so (через dlopen) они подхватят librouter.so, который к тому времени уже будет загружен в основной программе



Это сообщение отредактировал(а) xvr - 9.11.2014, 13:39
PM MAIL   Вверх
Cheloveck
Дата 9.11.2014, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Описан dbus


--------------------
user posted image
PM Jabber   Вверх
svlary
Дата 10.11.2014, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(fish9370 @  8.11.2014,  22:48 Найти цитируемый пост)
обоснованная критика архитектуры приветствуется 


А почему нельзя воспользоваться СТАНДАРТНЫМ механизмом очередей сообщений в Linux?
- man 2 msgget
- man 3 mq_open

Это база. Можно воспользоваться d-Bus, если хочется поковыряться...smile

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

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


Опытный
**


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

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



Цитата(svlary @  10.11.2014,  11:28 Найти цитируемый пост)
А почему нельзя воспользоваться СТАНДАРТНЫМ механизмом очередей сообщений в Linux?
- man 2 msgget
- man 3 mq_open


наверно можно, но это будет менее эффективно, все-таки msgget это механизм IPC. А так же, после, все-равно придется выполнять копирование в тот самый объект (хеш-таблица), так как с ним ведется работа

dbus - тоже IPC

Цитата(svlary @  10.11.2014,  11:28 Найти цитируемый пост)
Просто, дело в том, что реализуя механизм очередей сообщений самостоятельно, Вы неизбежно столкнётесь с проблемой блокировок и анализом полноты буферов. Это не очень простые задачи.


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

Добавлено @ 15:51
Цитата(xvr @  9.11.2014,  13:38 Найти цитируемый пост)
Модуль router оформляется как librouter.so файл (с описанием объекта без каких либо префиксов в нем самом и с extern в соответствующем *.h файле) Главная программа линкуется с librouter.so, с ним же ликуются при компиляции все остальные загружаемые модули (они должны быть собраны в виде *.so файлов).
Тогда при загрузке этих *.so (через dlopen) они подхватят librouter.so, который к тому времени уже будет загружен в основной программе


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

я не понимаю, почему ld не может его слинковать с глобальным символом, если он находится в модуле router.so и грузится раньше остальных. Он же глобальный



Это сообщение отредактировал(а) fish9370 - 10.11.2014, 15:59


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


Эксперт
***


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

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



Цитата
Описан dbus


Описан любой message oriented middleware. То есть вообще любой, от zeromq до CORBA/WebSphere.

И совершэнно необязательно брать сразу самый дебильно сделанный.
PM MAIL   Вверх
xvr
Дата 10.11.2014, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
я не понимаю, почему ld не может его слинковать с глобальным символом, если он находится в модуле router.so и грузится раньше остальных.

Может, именно это я и предлагал. А что бы на этапе сборки линкер не ругался, ему этот router.so надо подать в линковку (при сборке модулей/динамических библиотек).


PM MAIL   Вверх
Guinness
Дата 10.11.2014, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tzirechnoy @  10.11.2014,  18:41 Найти цитируемый пост)
И совершэнно необязательно брать сразу самый дебильно сделанный. 

А почему самый дебильный? Я просто его использовал в связке с Qt, не скажу, что получал удовольствие, скорее наоборот, но оно работало. Потом пытался найти какую-то межхостовую его замену и наткнулся на ZeroC Ice. По описанию понравилось, даже написал тестовый примерчик Python vs C++. К несчастью времени попользовать его в боевых условиях не хватило. Приведённые Вами
Цитата(tzirechnoy @  10.11.2014,  18:41 Найти цитируемый пост)
 от zeromq до CORBA/WebSphere

лучше или каждый хорош по своему?
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @  10.11.2014,  18:05 Найти цитируемый пост)
Может, именно это я и предлагал. А что бы на этапе сборки линкер не ругался, ему этот router.so надо подать в линковку (при сборке модулей/динамических библиотек).


я попробую поиграться в разделе описания, раньше у меня таких проблем не было

мне нужно было выговориться, слишком я долго носил это в себе


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


Эксперт
***


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

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



<quote>&gt;Если я описываю, объект как extern при связывании линкер пишет undefined symbol,</quote>

1) Ни в коем случае, никогда, never,  nie, nunca, jamais -- не делай глобальных объектов. И синглтонов тожэ не делай. Когда тебе будет можно -- ты ужэ прекрасно поймёшь, о чём я, и что я имел в виду, а пока не понял -- просто не делай.

2) Типичный -- вызываешь какую-нибудь функцыю init(), или connect("address") которая возвращает ссылку на нужный тебе объект. У объекта, если он действительно объект C++ -- хорошым тоном будет сделать какой-нибудь абстрактный предок, с несколькими чисто виртуальным функцыями. А если не C++, с простой C -- то, соответственно, можно сделать непрозрачную структуру, которая просто передаётся внутрь  функцый библиотеки-мессенджэра.

PM MAIL   Вверх
svlary
Дата 10.11.2014, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
все-таки msgget это механизм IPC


Разумеется. А в чём дело? Вы ведь писали:

Цитата
асинхронно вернуть результат,


Асинхронными могут быть только процессы (потоки/нитки). Иначе вся эта затея теряет смысл. Если изначально предполагалась многопоточность, т о почему же не использовать стандартные средства синхронизации?!

Добавлено через 10 минут и 43 секунды
Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
я не понимаю, почему ld не может его слинковать с глобальным символом

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

PM MAIL   Вверх
tzirechnoy
Дата 10.11.2014, 20:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
А почему самый дебильный?


Не знаю, как-то куда в нём ни ткнёшь -- в publish/subscribe, в marshalling (с системой типов из VBA, зато с обязательным юникодом), в релизацыю сервера, в его конфиг, в реальную поддержку tcp/ip -- всё как-то очень половинчато сделано. При  этом да, жыть можно -- да что там, я и на VBA писал, тожэ вполне себе язык программирования.

Цитата
лучше или каждый хорош по своему?


У каждого свои плюсы. У того жэ 0mq -- вообще не маршаллинга, всё относительно с очередями (впрочем, в dbus с очередями примерно такжэ) -- зато скорость высокая. У полувзрослых брокеров (rabbitMQ, например) -- много приятностей, вообще, на мой взгляд, из распространённого и подо все языки, rabbitMQ -- самый вменяемый вариант. Плюсов и возможностей совсем взрослых (webSphere той жэ) я пока не ощутил, но вполне допускаю, что отказоустойивость и интэроперабельность с джавой у них более на высоте.
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tzirechnoy @  10.11.2014,  19:33 Найти цитируемый пост)
Ни в коем случае, никогда, never,  nie, nunca, jamais -- не делай глобальных объектов. И синглтонов тожэ не делай. Когда тебе будет можно -- ты ужэ прекрасно поймёшь, о чём я, и что я имел в виду, а пока не понял -- просто не делай.


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


Цитата(tzirechnoy @  10.11.2014,  19:33 Найти цитируемый пост)
А если не C++, с простой C -- то, соответственно, можно сделать непрозрачную структуру, которая просто передаётся внутрь  функцый библиотеки-мессенджэра


1) не С++ 2) непрозрачную структуру - это как? 3) может пора уже что-то с русским языком сделать? сколько Вас читаю, ничего у Вас не меняется


Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Разумеется. А в чём дело?


Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Асинхронными могут быть только процессы (потоки/нитки). Иначе вся эта затея теряет смысл. Если изначально предполагалась многопоточность, т о почему же не использовать стандартные средства синхронизации?!


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



Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Для того, что бы ответить на этот вопрос, необходимо:
- Строчка исходного файла, в котором объект объявляется глобальным
- Строчка исходного файла (другого) в котором он используется
- Строчки из make-файла, в которых компиллируются и линкуются эти два объектных (so) файла.


Код

/* router.so */
struct hashtable users;


Код

/* monitor.so */
struct hashtable users;              /* либо так, */
extern struct hashtable users;    /* либо так - оба успешно компилируются*/


Код

#nm -n ./router.so | grep users
0000000000217180 B users

#nm -n ./monitor.so | grep users
0000000000217580 B users          <--- первый случай
                           U users          <--- второй случай



компилится с ключами -fPIC и -shared

линукуется динамически

Это сообщение отредактировал(а) fish9370 - 10.11.2014, 21:33


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


Эксперт
***


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

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



Цитата
2) непрозрачную структуру - это как? 


Это структура, поля которой не опубликованы для кода, который её использует. То есть как в stdio (stdin/stdout) или много где ещё. Доступ внутрь имеет только библиотека, которая обеспечивает интэрфейс к ней.

Да, передаётся обычно через указатель. 
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tzirechnoy @  10.11.2014,  21:35 Найти цитируемый пост)
Это структура, поля которой не опубликованы для кода, который её использует. То есть как в stdio (stdin/stdout) или много где ещё. Доступ внутрь имеет только библиотека, которая обеспечивает интэрфейс к ней.


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


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

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

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


 




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


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

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