Использоваться будет в embedded, с требованиями к минимальному размеру приложения и максимальной надёжностью.D-bus, во-первых жирный, а во-вторых нет на него стандарта, там постоянно что-то меняют. К тому же интерфейс на C не очень удобный. Процессы, между которыми нужно организовать общения, будут компилироваться в одной и той же среде, написано всё будет на С, поэтому проблем не будет ни с порядком байтов, ни с типами. Преимуществ в d-bus не вижу.
Можно конечно через named pipe, или через mmap-нутый файл, но для того и другого придётся писать больше кода, то есть вручную реализовывать передачу сообщений.
> Можно конечно через named pipe, или через mmap-нутый файл, но для того и другого придётся писать больше кода, то есть вручную реализовывать передачу сообщений.
Во-первых, сообщения будут небольшого размера. Потом, допустим сервер упал, данные в сокет будет невозможно записать, то есть клиент должен у себя их сохранять. Это усложняет клиент, что не есть хорошо, ибо клиенты в основном будут управлять железом.
ну допустим. хотя как водится, все течет, все меняется.
> Потом, допустим сервер упал, данные в сокет будет невозможно записать, то есть клиент должен у себя их сохранять.
ну и пусть сохраняет, какие проблемы? отдельный поток на передачу данных через тот или иной IPC и внутренняя очередь исходящих сообщений. anyway скорее всего подобную конструкцию придется делать руками, бо далеко не факт, что перенос буферизации сообщений на пречи системной очереди вас в конечном итоге устроит.
впрочем, попробуйте какие проблемы, это не сложно.
> Это усложняет клиент, что не есть хорошо, ибо клиенты в основном будут управлять железом.
Потоки использовать не хочется, потому что есть мало опыта в создании многопоточных приложениях и сложность их отладки. Клиент получается слишком большим, разработка его должна быть наиболее простой. Так в чём недостаток MQ? Максимальный размер очереди и размер сообщения не критичен. Если уж понадобиться передать много данных, то тогда открыть тот же пайп или сокет.
> Потоки использовать не хочется, потому что есть мало опыта в создании многопоточных приложениях и сложность их отладки. Клиент получается слишком большим, разработка его должна быть наиболее простой. Так в чём недостаток MQ? Максимальный размер очереди и размер сообщения не критичен. Если уж понадобиться передать много данных, то тогда открыть тот же пайп или сокет.
да по большому счету ни в чем. просто есть более универсальные и распространенные IPC, только и всего.
> Вроде бы очереди/семафоры/разд.память везде есть и лежат в основе более навороченых решений - т.е. они же и наиболее универсальны?
спорный вопрос. очереди, семафоры и разд. память есть не везде или же не в полном объёме/со своей спецификой. в то время как UDS сокеты или же TCP/loopback - как пример - есть действительно практически везде [последний хоть в Win32].
например, в NetBSD нет именованных семафоров [может уже есть?], в Linux не так давно то-же чего-то не было etc.
А для чего тогда POSIX? Тут дело такое, если система не поддерживает POSIX, это уже проблемы системы, и её использовать тогда не предполагается. Сокеты для моей задачи не подходят.
POSIX? да в сущности ни для чего. хочешь - следуй, не хочешь - не следуй. хочешь - что-то промежуточное [как правило]. никто ведь не насилует и на сертификацию соответствия пинками не гонит.
> Тут дело такое, если система не поддерживает POSIX, это уже проблемы системы, и её использовать тогда не предполагается. Сокеты для моей задачи не подходят.
да бога ради, это уже сугубо ваши проблемы и проблемы вашего выбора, без вопросов :)
Это не понадобится:) Типизация нужно в многоязыковой среде, чтобы было понятно, что пришло, и когда не сразу известно, во время compile-time, структура сообщений. То есть для десктопа d-bus очень хорош, для системы со 130Мгц процом и 8-ми мегабайтами флеша как-то не очень:) Поэтому вопрос о дата-центрах тут не уместен, разве что из тысячи таких девайсов сделать кластер:)
Я бы написал свою обертку над чем-то из этого (Скорее всего systemV, т. к. это стандарт де факто). А если понадобится перейти на POSIX, Win32, ... никаких проблем не будет, более того, не будет проблем даже при переходе на сокеты, а написать надо 3-4 функции.
ну понятно, что будет работать через обёртки, чтобы можно было поменять, если что:) Пока что я думаю, как первую версию делать, на Posix IPC или SystemV IPC.
POSIX IPC примитивы автоматически удаляются после умирания последнего процесса-пользователя.
SV IPC примитивы требуют явного удаления и могут оставаться в системе даже если ни одного процесса-пользователя уже нет. Хорошо это или плохо - вопрос отдельный, но "залипание" и необходимость аккуратного удалений/пересоздания SV IPC примитивов после падения программы - известная проблема.
Читайте Стивенса! У него чёрным по белому написано, что у Posix MQ время жизни ядра, то есть, если даже нет процессов, которые открыли очередь, то она не должна удаляться. Fifo и сокеты - наоборот, живут только когда живёт процесс. Posix IPC и SV IPC отличаются в основном названиями функций, и идентификаторами объектов.
> У него чёрным по белому написано, что у Posix MQ время жизни ядра, то есть, если даже нет процессов, которые открыли очередь, то она не должна удаляться.
если посмотреть в ядро Linux то можно легко заметить, что очередь сообщений POSIX - это объект файловой системы. со всеми вытекающими...
> Fifo и сокеты - наоборот, живут только когда живёт процесс.
может pipe а не fifo? и какие именно сокеты? UDS, к примеру, могут жить существенно дольше, чем породивший их процесс..
А вы понимаете отличие между __ЗАКРЫТИЕМ__ файла и его __УДАЛЕНИЕМ__? mq_close и mq_unlink - РАЗНЫЕ функции. Далее, я имел в виду именованные каналы - FIFO, неименованные каналы, и сокеты, не важно какие - при записи в них, когда нет читателя, что происходит? Правильно - SIGPIPE. То есть данные туда можно писать только когда есть читатель.
>> У него чёрным по белому написано, что у Posix MQ время жизни ядра, то есть, если даже нет процессов, которые открыли очередь, то она не должна удаляться.
> если посмотреть в ядро Linux то можно легко заметить, что очередь сообщений POSIX - это объект файловой системы. со всеми вытекающими...
который, впрочем, располагается на отдельной mqueue fs -> при перезагрузке созданные очереди, очевидно, будут потеряны и время жизни ядра будет соблюдено.
Я имел в виду информацию, которая храниться в IPC объекте. Так же нельзя прочитать данные из сокета/канала если нет писателя, для MQ - это можно сделать.
>который, впрочем, располагается на отдельной mqueue fs -> при перезагрузке созданные очереди, очевидно, будут потеряны и время жизни ядра будет соблюдено.
> А вы понимаете отличие между __ЗАКРЫТИЕМ__ файла и его __УДАЛЕНИЕМ__? mq_close и mq_unlink - РАЗНЫЕ функции.
Почитай ман про mq_unlink.
> Далее, я имел в виду именованные каналы - FIFO, неименованные каналы, и сокеты, не важно какие - при записи в них, когда нет читателя, что происходит? Правильно - SIGPIPE. То есть данные туда можно писать только когда есть читатель.
Это к времени жизни объекта никакого отношения не имеет.
Тут важно понять, под чем понимать "объект IPC". Если в объём понятия "объект IPC" входит его название либо идентифиактор и функции, при помощи которых им можно управлять, то тот же fifo прекращает своё существование как только изчезает процесс-писатель, так как при выполнении функции чтения будет ошибка.