LINUX.ORG.RU

Совет по архитектуре


1

2

Привет. Есть вот такая вот связка:

-----------------------------      socket          ---------                  ----------
| shared library (API)      |  < ---------- >     | daemon |      < --- >     | device |
-----------------------------                      ---------                  ----------

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

Мне пока видится несколько варинтов:

  • Использовать конфигурационный файл для демона и запускать по треду на устройство.
  • Вообще отказаться от демона (не сильно представляю его нужность), поскольку демон чисто дополнительная прослойка между API и устройством, и интегрировать часть для общения с устройством в библиотеку. (upd. как я понял, преимущество демона будет видно, когда несколько приложений будут обращаться к одному устройству)
  • Как-то ещё?

Спасибо.

★★★★★

Последнее исправление: UVV (всего исправлений: 1)

Мне кажется, что такой подход не самый лучший

Нормальный подход.

Использование демона позволяет реализовать более гибкие права доступа, чем стандартные юниксовые биты «rwxrwxrwx».

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

Deleted
()

Один демон, который ждет подключение.

При подключении устройства - fork.

Хотелось бы узнать чуть больше о том, как происходит общение устройства/демона/библиотеки между собой, какие типичные/нетипичные задачи выполняются в ходе взаимодействия.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)

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

почему бы и нет? Подход наиболее простой из возможных, не нужно лишнего геморроя с тредами и общими ресурсами, есть возможность пинать снаружи только нужные экземпляры системными средствами (kill, ps|grep итд). Юниксвей жеж.

arkhnchul ★★
()
Ответ на: комментарий от trex6

библиотека/демон: команда - ответ
демон/устройство: та же команда (иногда немного изменённая) - ответ устройства.

UVV ★★★★★
() автор топика

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

Реально многопользовательских устройств мало. Если твое не из таких, лучше отслеживать open в драйвере, или на худой конец лок-файлом.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Реально многопользовательских устройств мало. Если твое не из таких, лучше отслеживать open в драйвере, или на худой конец лок-файлом.

Да, обычный use-case одно устройство на комп, просто хочется понять как архитектурно правильно реализовать. Что имеется ввиду с open?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Что имеется ввиду с open?

У драйвера есть процедура, обрабатывающая open(2). Впрочем, если у устройства есть сетевой интерфейс, ХЗ что тебе посоветовать - ты слишком мало рассказал о задаче.

tailgunner ★★★★★
()

по потоку чтения на устройство, единый eventloop в демоне на потоки чтения

VladimirMalyk ★★★★★
()
Ответ на: комментарий от UVV

Человеческий init скрипт не сделаешь же.

если это потому, о чем я подумал, то

...
start)
for i in `find /dev -iname "девайс_без_цифры*"`; do запускалка_демона --device $i; done
...

arkhnchul ★★
()
Ответ на: комментарий от UVV

Тогда все именно так, как я написал. По одному форку на устройство, демон распихивает команды нужным потокам. Но, ИМХО, через получение контекста было бы удобнее.

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