Was ist eine gute tragbare Art und Weise ein globales signalable Ereignis in einer POSIX-Umgebung zu implementieren

StackOverflow https://stackoverflow.com/questions/4326211

  •  29-09-2019
  •  | 
  •  

Frage

Der Anwendungsfall ist, dass eine Anwendung ein Ereignis erzeugt und ein Signal aussendet, dass jede Anwendung, die Sorgen zu hören es bekommen. Z.B. eine Anwendung aktualisiert den Inhalt einer Datei und signalisiert dies. Unter Linux kann dies von den Kellnern auf die Datei aufrufen inotify erfolgen. Ein tragbarer Weg wäre, für Hörer mit einem bekannten Server zu registrieren, aber ich würde etwas einfacher, wenn möglich bevorzugen. So portabel wie möglich bedeutet im Idealfall nur POSIX-Funktionen verwendet, die ebenfalls weit verbreitet sind.

War es hilfreich?

Lösung

Option Schloss-Dateien

Sie können dies tun, indem Sie eine Datei sperren.

Signalgeber Ersteinrichtung:

  • Erstellen Sie eine Datei mit einem bekannten Namen und verriegeln Sie ihn zum Schreiben (fcntl(F_SETLK) mit F_WRLCK oder Herd (LOCK_EX) `).

Signalempfänger Prozedur:

  • Öffnen Sie die Datei, die die bekannten Dateinamen verwenden und versuchen, eine Lesesperre auf sie (fcntl(F_SETLK) mit F_RDLCK oder flock(LOCK_SH)) zu erhalten.
  • Empfänger blockiert, weil der Emitter ist eine in Konflikt stehende Schreibsperre zu halten.

Signalverteilung:

  • Signalgeber erzeugt eine neue temporäre Datei
  • erhält Signalgeber eine Schreibsperre auf die neue temporäre Datei
  • umbenennt Signalgeber die neue temporäre Datei zu dem bekannten Dateinamen. Diese clobbers die alte Sperrdatei, aber die Warte Empfänger alle Verweise auf sie behalten.
  • Signalgeber die alte Sperrdatei wird geschlossen. Dadurch löst sich die Sperre auch.
  • Signalempfänger alle aufwachen, denn jetzt können sie ihre Lesesperren erhalten.
  • Signalempfänger sollten die Datei schließen sie eine Sperre auf gerade erhalten haben. Es wird nicht wieder verwendet werden. Wenn sie für den Zustand warten soll wieder passieren, sollten sie die Datei öffnen.

In dem Signalgeber, die temporäre Sperrdatei, die jetzt über die Oberseite der ursprünglichen Lock-Datei umbenannt wurde wird die neue aktuelle Sperrdatei.

Option Netzwerk mit Multicast

Haben Sie den Empfänger verbinden, um eine Multicast-Gruppe und Warten auf Pakete. Haben die Signalgeber senden UDP-Pakete an diese Multicast-Gruppe.

können Sie binden die sowohl das Senden und UDP-Sockets an den Loopback-Schnittstelle empfangen, wenn Sie es wollen nur Host-lokale Kommunikation verwenden.

Andere Tipps

Am Ende habe ich einen gebundenen Unix-Domain-Socket. Der Eigentümer hält eine Reihe von Client FDs und sendet jeweils eine Nachricht, wenn es ein Ereignis ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top