2009-12-15 4 views
7

Я ищу легкий, быстрый и простой способ обработки Inter Process Communication между некоторыми программами на машине Linux.Рекомендация в области межпроцессного взаимодействия

В настоящее время я думаю, что Named Pipe, потому что он предоставляется самой ОС. Есть ли какие-либо замечания относительно производительности или удобства использования?

Будет ли общая память лучше?

Не думаю, что мне нужен суперкомплексный Framework.

Пожалуйста, указывайте мне в правильном направлении, спасибо!


Update: Я хочу построить небольшую программу (демон), который говорит другие программы (которые он сам начинает), чтобы приостановить, сообщать о своем состоянии назад, стоп и т.д.

Так другая программа должна быть уведомленным о том, что ждет его новая команда. Труба не идеальна для этого, не так ли?

ответ

4

У Boost есть хорошая библиотека InterProcess, которая является кросс-платформенной и довольно интуитивно понятной.

Я только играл с ним, так что там могут быть лучшие альтернативы.

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

+0

Это выглядит интересно. Я посмотрю на это. Кажется, я всегда забываю взглянуть на библиотеки ускорения. – brandstaetter

10

Как вы уже видели, вы можете использовать для межпроцессорного взаимодействия

  • Общей память
  • Названных трубы
  • TCP/UDP сокетов (в конце концов местные)

Общей память имеет преимущество производительности, потому что у вас нет буфера при отправке/получении сообщений. Но вам нужно синхронизировать обмен данными с другим IPC. Это могут быть семафоры IPC или ... именованные каналы или сокеты.

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

Лучший способ - абстрагировать ваше общение с классом, который может использовать разделяемую память, когда два процесса находятся на одном компьютере и сокетах, если нет. Затем вам нужно выбрать между UDP и TCP ;-)

Для обмена синхронизацией и буфером предпочитайте TCP более надежным.

Я не использовать именованные каналы, как я предпочитаю гнездо для возможности использования компьютера среди communicationand, конечно, вы можете найти много портативных библиотеки сокетов ...

my2cents

EDIT:

Для синхронизации общий доступ, возможно, не самый лучший инструмент.В вашем случае это может быть использовано путем совместного использования небольшого пространства памяти с пространством для каждого процесса, который ждет команд. Вы можете либо опросить любую команду, либо использовать общий семафор. Самый быстрый способ - это процессы, ожидающие названные семафоры, и чтение разделяемого пространства памяти для своих команд/параметров. Использование именованных каналов, безусловно, проще, но не так быстро. Вам, конечно, не нужно так быстро? В любом случае, абстрагируйте то, что в классе, который моделирует ваш обменный протокол и пробует два способа :-)

+0

Я хотел бы иметь что-то, не используя служебные данные TCP-стека, так как требуется оптимальная производительность. Мы будем использовать TCP для связи с другими машинами, но локально что-то быстрее было бы идеально. – brandstaetter

+1

@brandstaetter: В этом случае общий доступ является способом. Чем больше данных, тем лучше производительность. Другие IPC (и сокет) должны буферизировать, даже если они оптимизированы. С общим mem вы уверены, что нет накладных расходов на буфер. Мы используем общий mem для обмена изображениями. Синхронизация может выполняться с помощью именованного канала или (локального) сокета, который проще управлять, чем общий семафор (и более портативный). Вы можете даже обойтись без зависимости от вашего протокола данных/обмена ... – neuro

+0

+1 для уровня абстракции –

1

Я бы использовал unix-сокеты или некоторую библиотеку, которая их обертывает. Сокеты Unix довольно просты в использовании.

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

+0

+1: да, почему бы и нет. Не лучший способ синхронизации, но вы можете использовать маркер/счетчик для синхронизации. – neuro

4

Хороший выбор - использовать socketpair, очень быстро и эффективно.

+0

+1 ах да хорошая точка – neuro

1

Общая память вместе с семафорами является самой быстрой и прозрачной, если вы хотите создавать программное обеспечение прямо из примитивов.

Именованные трубы не слишком отличаются от труб и хорошо работают между двумя процессами, а не с сервером и многими клиентами.

Если вам нравится строить существующую инфраструктуру, то dBus является опцией.

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

Смежные вопросы