Как использовать несколько экземпляров одной и той же библиотеки - PullRequest
1 голос
/ 06 февраля 2012

Мне нужно расширить программу на C, которая управляет одним дроном (попугай AR Drone).Цель состоит в том, чтобы управлять эскадроном дронов, но API использует огромное количество глобальных переменных (IP-адреса дронов, порты, статус дронов ...).Как я могу несколько раз создать экземпляр библиотеки, не столкнувшись между экземплярами?

Единственное решение, которое я нашел, - это изменить API (с открытым исходным кодом) для вызова fork () где-то в главном.(), и я бы хотел избежать этого ...

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

dlmopen может загружать одну библиотеку несколько раз. Но это ограничено 15 разами.
Вы также можете создать несколько копий своей библиотеки и загрузить каждую из них.

1 голос
/ 06 февраля 2012

Я бы рекомендовал просто обернуть библиотеку в процессе обслуживания. Затем вы можете запустить один экземпляр сервисного процесса для каждого дрона. В противном случае исправьте библиотеку, чтобы она принимала параметр контекста.

0 голосов
/ 06 февраля 2012

Используйте макросы для замены всех глобальных переменных следующим образом:

#define global1 ctx->global1
#define global2 ctx->global2
...

Затем добавьте аргумент struct context *ctx для каждой функции.

В качестве альтернативы, добавьте _Thread_local (или __thread со старыми версиями gcc) к каждой глобальной переменной, затем запустите каждый "экземпляр" в своем собственном потоке, чтобы у него, естественно, были свои собственные копии глобальных переменных, доступных для него.

...