LINUX.ORG.RU

Компиляция и использование .so


0

0

Задача стоит примерно такая:

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

В винде разделяемые библиотеки бывают двух видов: однопоточные (т.е. в библиотеке прогер реализует работу библиотеки только с одним приложением, а если либу используют несколько приложений, то разруливает процесс сама винда) и многопоточные (т.е. прогер говорит, что работу либы с несколькими приложениями либа умеет разруливать сама и ось в её дела уже не лезет). Думаю, что в пингвине всё примерно так же...

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

Заранее спасибо.

anonymous

Забыл сказать. Скорее всего кто-нить посоветует вместо глобальной переменной объявить все поля статическими. Не выйдет, т.к. глобальных переменных будет на самом деле не одна а целый std::vector

anonymous
()
Ответ на: комментарий от anonymous

Вы неправильно понимаете.

Разделяемая библиотека отображается в адресное пространство процесса в режиме COW (copy-on-write), то есть при попытке записать что-либо в её страницы памяти для такого процесса будет создана приватная копия данной страницы.

Нужно использовать какой-либо из механизмов IPC (shared mem, mmaped files, etc), точнее сказать трудно, если не известно, что точно нужно сделать и какие параметры ожидаются у межпроцессного обмена.

anonymous
()
Ответ на: комментарий от anonymous

> Разделяемая библиотека отображается в адресное пространство 
> процесса в режиме COW (copy-on-write), то есть при попытке записать 
> что-либо в её страницы памяти для такого процесса будет создана 
> приватная копия данной страницы. 

Именно это в Windows называется однопоточной библиотекой. В 
противовес многопоточным.

Если я правильно вас понял, создание библиотек, которые не копируют 
страницы при записи, а имеют общие данные для всех работающих с ними 
процессов в Linux невозможно, так?

> Нужно использовать какой-либо из механизмов IPC (shared mem, mmaped 
> files, etc), точнее сказать трудно, если не известно, что точно 
> нужно сделать и какие параметры ожидаются у межпроцессного обмена. 

Хм.
Хорошо, давайте опишу задачу.
Больше всего то, что мы пишем, похоже на СУБД, хотя им ни в коей мере 
не является. Упрощённо pаголовок выглядит примерно так:

class smth
{
  public:
    FILE* query(std::string querystring)
    {
      // тут добавляем элемент в очередь и возвращаем хвост 
      // от трубы, в которую будет писаться результат
    }
    void work()
    {
      for(;;)
        // тут обрабатываем очередь или спим, если она пуста
    }
  private:
    std::queue< std::pair<std::string, FILE*> > queries;
    // это - очередь, в которой складируются запросы и начала тех 
    // труб, в которые будем выводить результат
};

Это, конечно, далеко не всё, но концепция вроде ясна.
В чём смысл: хочется иметь один такой объект (на самом деле - 
несколько, но для простоты один), причём функция work() будет дёрнута 
в одном процессе, который будет жить постоянно, а функция query() 
будет дёргаться из любых других приложений, которым нужны данные.

Как такое делается?


anonymous
()
Ответ на: комментарий от anonymous

> А почему этот объект должен лежать в shared mem? Не проще ли > завести unix socket или fifo?

Нее... Так определённо не получится. Вернее, получится - но геморроя будет... Я ведь очень упрощённый хедер дал. Лучше уж я в разделяемой памяти разберусь.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.