[C++] Signale/Variablen an ein laufendes Programm senden?

... komplette Frage anzeigen

4 Antworten

Eine bisher noch nicht genannte Möglichkeit wäre Signale mit Shared Memory zu kombinieren.

Im Grunde recht einfach:

1. Programm A erstellt ein SHM-Segment und "hängt sich dran".

2. Programm A registriert einen Signal Handler z.B. für SIGUSR1 in dem der aktuelle Wert des SHM-Segmentes augewertet und verarbeitet wird.

3. Programm B hängt sich an das SHM-Segment und verändert/setzt den Wert ensprechend den Anforderungen.

4. Programm B sendet in diesem Beispiel SIGUSR1 an Programm A um zu signalisieren, dass der Wert im SHM-Segment ausgewertet werden soll.

Hier noch ein (wirklich sehr rudimentäres) Beispiel:

ProgrammA.cpp: http://pastebin.com/3mC5teyX

ProgrammB.cpp: http://pastebin.com/W8W9C3Kj

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von adulescentulus
11.07.2016, 07:29

Danke, hatte es erst via File gelöst gehabt aber deine Methode finde ich Sauberer :)

0

Nimm dafür doch einfach eine FIFO, die du mit O_NONBLOCK öffnest! Oder frage diese mittels poll() / select() ab.

Allgemein lautet dein Stichwort IPC: Inter-Process-Communication

Dafür gibt es unglaublich viele verschiedene Möglichkeiten und die alle aufzuzählen würde hier deutlich den Rahmen sprengen. Allerdings solltest du auf SysV-Sachen verzichten, denn die haben - verglichen mit anderen Methoden - große Nachteile.

Für deinen Anwendungsfall wären übrigens POSIX Message Queues perfekt, denke ich. (Nimm keine SysV-Message Queues!)

Übrigens: Wenn du sowieso nur lokal arbeitest, dann nimm keine Netzwerk-Sockets, sondern Unix-Domain-Sockets! Die API dazu ist (fast) zu 100% kompatibel, allerdings sind Letzere um ein vielfaches effizienter!

Also an deiner Stelle würde ich FiFos, Posix-MQs oder Unix-Domain-Sockets nehmen.

Wenn Prozess A und B in beide Richtungen miteinander kommunizieren können sollen, dann musst du natürlich - wie bei einer richtigen Server-/Client-Architektur - auf Dämonseite ab und zu horchen, ob etwas angekommen ist, und wenn ja, einen neuen Kanal öffnen, über den dann ausschließlich der Dämon mit dem Kontrollprogramm redet.

Für die Serverseite reicht m. M. n. auch eine simple Pipe, aber PMQs sind auch hier komfortabler. Danach können sich beide Prozesse darauf einigen, über welchen Schlüssel, Port, Datei, Speicherbereich, wasauchimmer sie kommunizieren möchten.

Viel Erfolg! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von adulescentulus
01.07.2016, 10:45

Danke! Das war genau das wonach ich gesucht hatte :)

1

Multithreading ist die Lösung. Du machst einen Thread der wartet, und einen Thread der arbeitet.

Alternativ machst Du eine Schleife, die schaut, ob im Socket was angekommen ist, und wenn nicht, die "normale" Arbeit weitermacht.

Du kannst natürlich versuchen, mit shared Memory zwischen Tasks zu arbeiten, aber das ist in meinen Augen viel zu kompliziert und unsauber für die Aufgabe, die Du bearbeiten möchtest.

Antwort bewerten Vielen Dank für Deine Bewertung

über tcp ist eine möglichkeit oder aber über eine temporäre datei

A erstellt ein file mit dem inhalt.

B wartet auf die datei wertet diese aus und löschte sie oder ergänzt sie mit der antwort.

über tcp ist es komplexer aber dafür sauberer.

warum geht's nicht asynchron?

du musst halt Threads erstellen damits asynchron läuft

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?