Linux IPC - несколько писателей, один читатель - PullRequest
1 голос
/ 15 сентября 2009

Я никогда ранее не писал ни одного IPC C ++ для Linux.

Моя проблема в том, что у меня будет несколько клиентов (писателей) и один сервер (читатель). Все это будет на одной машине. Авторы будут доставлять блоки данных (строку / структуру) читателю. Затем читатель прочитает их в FIFO и что-то с ними сделает.

Насколько я могу судить, типы IPC в Linux - это либо Pipes, либо Sockets / Message Queues.

Мне просто было интересно, может кто-нибудь порекомендовать мне путь, по которому я могу пойти. Я склоняюсь к розеткам, но у меня нет реальной основы для этого. Есть ли что-то, что я должен прочитать / понять, прежде чем отправиться в это путешествие?

Спасибо

Ответы [ 5 ]

5 голосов
/ 15 сентября 2009

Основная проблема, которую вы должны рассмотреть, это то, какие данные вы передаете, поскольку это отчасти определит ваши варианты. Это сводится к тому, ограничены ли ваши данные или нет. Если он не ограничен, то подходит что-то ориентированное на поток, например, FIFO или сокеты; если это так, то вы могли бы лучше использовать такие вещи, как MQ или разделяемая память. Поскольку вы упоминаете как строки, так и структуры, трудно сказать, что подходит для вашего случая, хотя, если ваши строки ограничены каким-то разумным максимумом, вы можете использовать что угодно с незначительными изменениями.

Второе - это скорость. На этот вопрос никогда не бывает полностью правильного ответа, но обычно он звучит примерно так: общая память, MQ, FiFO, доменные сокеты, сетевые сокеты.

Третий - простота использования. Общая память - это самая большая PITA, так как вам приходится самостоятельно выполнять синхронизацию. Трубы просты, если длина вашего сообщения остается ниже размера PIPE_BUF. ОС справляется с большинством ваших головных болей с помощью MQ. Розетки достаточно просты, но у вас есть шаблон настройки.

Наконец, некоторые из механизмов IPC имеют варианты POSIX и SYSV. Обычно POSIX - это путь, если у типа SYSV нет какой-то функции, которая вам действительно нужна или нужна.

РЕДАКТИРОВАТЬ: ответ Count0 напомнил мне, что вам может быть интересно что-то более абстрактное и более высокий уровень. В дополнение к ACE вы можете посмотреть на Poco . И, конечно же, ни один SO-ответ не будет полным, если в нем не упоминается Boost .

3 голосов
/ 15 сентября 2009

System V IPC несколько сложен в использовании, но это зрелая и надежная технология. Очереди сообщений, вероятно, будут делать то, что вы хотите, и поддерживать атомарную организацию очередей / удаление очередей.

Сокеты просты в использовании и поддерживают связь по сети. Однако они не создают никакой очереди, поэтому вам придется написать код управления очередью на вашем сервере. Использование сокетов с C ++ не сильно отличается от их использования с C. В сети есть множество руководств по этому вопросу и книг, таких как «Unix Network Programming (vol. 1)» Стивенса, в которых подробно рассматривается эта тема.

2 голосов
/ 15 сентября 2009

Несмотря на то, что вы не просили о книгах, и потому что ответы выше так хороши, я только предлагаю вам получить копии этих двух томов:

Сетевое программирование в UNIX, том 2, второе издание: межпроцессное взаимодействие, У. Ричард Стивенс

Расширенное программирование в среде UNIX, второе издание, У. Ричард Стивенс и Стивен А. Раго

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

2 голосов
/ 15 сентября 2009

Хорошее место, чтобы намочить ноги, это учебник по розеткам .

Затем вам нужно набить потоков и мьютексов и здесь .

С учетом вышесказанного вы готовы начать играть; -)

1 голос
/ 15 сентября 2009

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

Особенно Ace_Task с помощью Message_Queue позволяют делать то, что вам нужно.

...