Frage von adulescentulus, 26

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

Guten Tag,

folgendes Szenario:

Ich habe ein Programm A in C++11 geschrieben was als Deamon im Hintergrund läuft. Nun würde ich gerne mittels einen anderen Programm B, Programm A ansprechen. Beide Programme laufen auf den selben PC (OS: xUbuntu)

zb. B sagt A ändere bitte deine Variable y auf den Wert 100

B sagt A er soll den Wert Variable y an B geben.

Meine erste Idee war via SIGUSR Befehle zu übermittel (was aber nur ein Signal und ich somit keine Variablen ändern kann).

Meine 2. Idee war nun einen TCP/IP Socket zu verwenden, aber diesen Bekomme ich irgendwie nicht asyncron hin (sprich A wartet immer das er was gesendet bekommt und stoppt an der stelle).

Kennt jemand eine saubere Variante zur Umsetzung oder hat eine bessere Idee?

Es muss nur 2 Fälle abfertigen können:

  • Setze Variable x
  • Prüfe Wert y und gib mir ein richtig oder falsch zurück

Infos:

  • Sprache : c++
  • OS: Linux xUbunut 64bit
  • Läuft alles auf einen PC
Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Isendrak, 6

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

Kommentar von adulescentulus ,

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

Antwort
von TeeTier, 5

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! :)

Kommentar von adulescentulus ,

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

Antwort
von W00dp3ckr, 11

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
von Kiboman, 12

ü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

Keine passende Antwort gefunden?

Fragen Sie die Community