Prozessübergreifende Kommunikationsempfehlung [geschlossen]

7

Ich suche nach einem leichten, schnellen und einfachen Weg, die Interprozesskommunikation zwischen einigen Programmen auf einem Linux-Rechner zu handhaben.

Momentan denke ich Named Pipe, weil es vom Betriebssystem selbst bereitgestellt wird. Gibt es irgendwelche Einschränkungen bezüglich der Leistung oder Benutzerfreundlichkeit?

Würde Shared Memory besser sein?

Ich glaube nicht, dass ich ein super-komplexes Framework brauche.

Bitte zeigen Sie mir in die richtige Richtung, danke!

Aktualisierung: Ich möchte ein kleines Programm (Daemon) bauen, das anderen Programmen (die es selbst startet) sagt, dass sie pausieren sollen, ihren Status zurück melden, aufhören etc.

So sollte das andere Programm benachrichtigt werden, dass ein neuer Befehl darauf wartet. Ein Rohr ist dafür nicht ideal, oder?

    
brandstaetter 15.12.2009, 09:13
quelle

6 Antworten

4

Boost hat eine nette InterProcess -Bibliothek, die plattformübergreifend und recht ist intuitiv.

Ich habe jedoch nur damit gespielt, also könnte es bessere Alternativen geben.

Wenn Sie jedoch keinen gemeinsamen Speicher benötigen, würde ich bei einem Messaging-Ansatz bleiben. Sie vermeiden Deadlocks und Rennbedingungen. Das Pipe-Prinzip ist wirklich großartig, und es ermöglicht sogar faule Verhaltensweisen, die Ihnen viel Verarbeitungsaufwand ersparen können!

    
Matthieu M. 15.12.2009, 09:28
quelle
10

Wie Sie gesehen haben, können Sie für die Kommunikation zwischen Prozessen verwenden:

  • Gemeinsamer Speicher
  • Benannte Pipes
  • TCP / UDP-Sockets (eventuell lokale)

Shared Memory hat den Vorteil der Performance, da Sie beim Senden / Empfangen von Nachrichten keinen Puffer haben. Aber Sie müssen Ihren Datenaustausch mit einem anderen IPC synchronisieren. Es können IPC-Semaphore oder ... Named Pipes oder Sockets sein.

Wenn Leistung nicht das Hauptziel ist, tendiere ich dazu, Sockets zu bevorzugen, da ihre Verwendung einfach ist und auf Intercomputerkommunikation ausgedehnt werden kann.

Am besten abstrahieren Sie Ihre Kommunikation mit einer Klasse, die gemeinsam genutzten Speicher verwenden kann, wenn sich die beiden Prozesse auf demselben Computer und Sockets befinden, wenn nicht. Dann müssen Sie zwischen UDP und TCP wählen ;-)

Bei der Synchronisierung / Pufferaustausch, bevorzugen Sie TCP als zuverlässiger.

Ich benutze keine Named Pipes, da ich Sockets für die Möglichkeit der Kommunikation zwischen Computern bevorzuge und natürlich kann man viele portable Socket-Bibliotheken finden ...

my2cents

BEARBEITEN:

Für die Synchronisierung ist das geteilte Mem möglicherweise nicht das beste Werkzeug. In Ihrem Fall kann es verwendet werden, indem ein kleiner Speicherplatz mit einem Speicherplatz für jeden Prozess freigegeben wird, der auf Befehle wartet. Sie können entweder nach einem eingehenden Befehl suchen oder einen gemeinsamen Semaphor verwenden. Am schnellsten warten Ihre Prozesse auf benannte Semaphore und lesen einen gemeinsamen Speicherbereich für ihre Befehle / Parameter. Named Pipes zu verwenden ist sicherlich einfacher, aber nicht so schnell. Du musst nicht so schnell sein? Jedenfalls abstrakt, dass in einer Klasse, die Ihr Austauschprotokoll Modelle und versuchen Sie die zwei Möglichkeiten: -)

    
neuro 15.12.2009 09:30
quelle
4

Eine gute Wahl ist socketpair , sehr schnell und effizient.

    
lsalamon 15.12.2009 10:25
quelle
2

D-Bus ist ziemlich nützlich und sehr stabil, um ipc auf demselben Host zu betreiben. Ссылка

    
GabiMe 15.12.2009 10:14
quelle
1
___ answer1906222 ___

Boost hat eine nette InterProcess -Bibliothek, die plattformübergreifend und recht ist intuitiv.

Ich habe jedoch nur damit gespielt, also könnte es bessere Alternativen geben.

Wenn Sie jedoch keinen gemeinsamen Speicher benötigen, würde ich bei einem Messaging-Ansatz bleiben. Sie vermeiden Deadlocks und Rennbedingungen. Das Pipe-Prinzip ist wirklich großartig, und es ermöglicht sogar faule Verhaltensweisen, die Ihnen viel Verarbeitungsaufwand ersparen können!

    
___ answer1906226 ___

Wie Sie gesehen haben, können Sie für die Kommunikation zwischen Prozessen verwenden:

  • Gemeinsamer Speicher
  • Benannte Pipes
  • TCP / UDP-Sockets (eventuell lokale)

Shared Memory hat den Vorteil der Performance, da Sie beim Senden / Empfangen von Nachrichten keinen Puffer haben. Aber Sie müssen Ihren Datenaustausch mit einem anderen IPC synchronisieren. Es können IPC-Semaphore oder ... Named Pipes oder Sockets sein.

Wenn Leistung nicht das Hauptziel ist, tendiere ich dazu, Sockets zu bevorzugen, da ihre Verwendung einfach ist und auf Intercomputerkommunikation ausgedehnt werden kann.

Am besten abstrahieren Sie Ihre Kommunikation mit einer Klasse, die gemeinsam genutzten Speicher verwenden kann, wenn sich die beiden Prozesse auf demselben Computer und Sockets befinden, wenn nicht. Dann müssen Sie zwischen UDP und TCP wählen ;-)

Bei der Synchronisierung / Pufferaustausch, bevorzugen Sie TCP als zuverlässiger.

Ich benutze keine Named Pipes, da ich Sockets für die Möglichkeit der Kommunikation zwischen Computern bevorzuge und natürlich kann man viele portable Socket-Bibliotheken finden ...

my2cents

BEARBEITEN:

Für die Synchronisierung ist das geteilte Mem möglicherweise nicht das beste Werkzeug. In Ihrem Fall kann es verwendet werden, indem ein kleiner Speicherplatz mit einem Speicherplatz für jeden Prozess freigegeben wird, der auf Befehle wartet. Sie können entweder nach einem eingehenden Befehl suchen oder einen gemeinsamen Semaphor verwenden. Am schnellsten warten Ihre Prozesse auf benannte Semaphore und lesen einen gemeinsamen Speicherbereich für ihre Befehle / Parameter. Named Pipes zu verwenden ist sicherlich einfacher, aber nicht so schnell. Du musst nicht so schnell sein? Jedenfalls abstrakt, dass in einer Klasse, die Ihr Austauschprotokoll Modelle und versuchen Sie die zwei Möglichkeiten: -)

    
___ qstntxt ___

Ich suche nach einem leichten, schnellen und einfachen Weg, die Interprozesskommunikation zwischen einigen Programmen auf einem Linux-Rechner zu handhaben.

Momentan denke ich Named Pipe, weil es vom Betriebssystem selbst bereitgestellt wird. Gibt es irgendwelche Einschränkungen bezüglich der Leistung oder Benutzerfreundlichkeit?

Würde Shared Memory besser sein?

Ich glaube nicht, dass ich ein super-komplexes Framework brauche.

Bitte zeigen Sie mir in die richtige Richtung, danke!

Aktualisierung: Ich möchte ein kleines Programm (Daemon) bauen, das anderen Programmen (die es selbst startet) sagt, dass sie pausieren sollen, ihren Status zurück melden, aufhören etc.

So sollte das andere Programm benachrichtigt werden, dass ein neuer Befehl darauf wartet. Ein Rohr ist dafür nicht ideal, oder?

    
___ answer190642 ___

Ich würde Unix-Sockets oder eine Bibliothek verwenden, die sie umschließt. Unix-Sockets sind ziemlich einfach zu bedienen.

Wenn Sie andererseits Statusinformationen mit fester Größe haben, die Sie zurückmelden können, könnten Sie die untergeordneten Prozesse einfach in eine Datei schreiben lassen (vermutlich ist es klein und Sie werden es nicht fsyncieren, so dass es nicht signifikant wird IO Workload).

    
___ answer1906426 ___

D-Bus ist ziemlich nützlich und sehr stabil, um ipc auf demselben Host zu betreiben. Ссылка

    
___ answer1906483 ___

Eine gute Wahl ist socketpair , sehr schnell und effizient.

    
___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur dann, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer11485573 ___

Gemeinsamer Speicher zusammen mit Semaphoren ist der schnellste und transparenteste, wenn Sie Software direkt aus den Primitiven erstellen möchten.

Benannte Pipes unterscheiden sich nicht zu sehr von Pipes und funktionieren gut zwischen einem Paar von Prozessen und nicht einem Server und vielen Clients.

Wenn Sie auf bestehende Infrastruktur aufbauen möchten, ist dBus eine Option.

Socket-Kommunikation ist vielseitig und skaliert gut, wenn Sie Ihre Anwendungen über Hosts in einem Netzwerk verschieben möchten.

    
___ tag123ipc ___ IPC steht für Inter-Process Communication und stellt eine Reihe von Methoden zum Austausch von Daten und Nachrichten zwischen Threads und Prozessen dar. ___ qstnhdr ___ Prozessübergreifende Kommunikationsempfehlung [geschlossen] ___
MarkR 15.12.2009 10:15
quelle
1

Gemeinsamer Speicher zusammen mit Semaphoren ist der schnellste und transparenteste, wenn Sie Software direkt aus den Primitiven erstellen möchten.

Benannte Pipes unterscheiden sich nicht zu sehr von Pipes und funktionieren gut zwischen einem Paar von Prozessen und nicht einem Server und vielen Clients.

Wenn Sie auf bestehende Infrastruktur aufbauen möchten, ist dBus eine Option.

Socket-Kommunikation ist vielseitig und skaliert gut, wenn Sie Ihre Anwendungen über Hosts in einem Netzwerk verschieben möchten.

    
kjohri 14.07.2012 16:48
quelle

Tags und Links