2016-05-06 12 views
2

Ich habe zwei Prozess, ProcessGUI und ProcessMaster. Meine beiden Prozesse werden unter bestimmten Bedingungen etwas tun. Angenommen, eine Sache passiert im Master-Prozess, der GUI-Prozess muss etwas anzeigen. Ich möchte dies anzeigen, indem ich das Ereignis fd ändere. Gibt es einen Weg, wo ich ein Event fd zwischen zwei Prozessen teilen kann.Wie ein Ereignis fd zwischen zwei Prozessen in Linux übergeben

+0

[Betrachten Sie stattdessen eine Pipe.] (Http://man7.org/linux/man-pages/man2/pipe.2.html) X passiert im Master, Master schreibt X in Pipe. GUI liest X aus der Pipe und zeichnet es auf dem Bildschirm. – user4581301

+1

Entweder stellen Sie sicher, dass das Flag 'eventfd'' CLOEXEC' nicht gesetzt ist, wenn Sie fork (in diesem Fall ist es das gleiche FD im Kindprozess) oder senden Sie es über [die 'SCM_RIGHTS'-Zusatznachricht eines Unix Domain-Socket] (http://linux.die.net/man/7/unix). (Hinweis: Dies gilt für die meisten Dateideskriptoren im Allgemeinen) –

+0

@ user4581301 Tatsächlich sind meine Daten sehr groß. Also lege ich es in geteiltes Gedächtnis. Ich möchte also nur das Event fd ändern, damit der andere Prozess es erkennen kann. Ich habe erfahren, dass das Ereignis fd leichter als die Nachrichtenwarteschlange ist und für die Kommunikation zwischen Prozessen sorgt. –

Antwort

-1

Sie können die Linux-Signale verwenden, um die beiden Prozesse zu kommunizieren. Hier haben Sie einige Beispiele: Linux signals.

Einer Ihrer Prozesse generiert ein Signal mit der Methode raise() und der andere registriert einen Signalhandler, um das Ereignis mit der Funktion signal() zu reagieren.

+0

'raise' reicht nicht aus, um ein Signal von einem Prozess zum anderen zu bewegen. – user4581301

+1

Ja, Sie haben Recht. Sie können eine gemeinsame Bibliothek mit gemeinsam genutztem Speicher zwischen beiden Prozessen erstellen. Das Signal zeigt also nur an, wenn sich etwas geändert hat. Dann können Sie mit Mutex-Mechanismen auf die freigegebenen Daten zugreifen. – klyone

0

Es gibt eine Reihe von Möglichkeiten, um das zu erreichen, was Sie wollen.

Die erste, die mir in den Kopf schoss, benutzt sendmsg, um das Eventfd über einen Socket zu teilen. Dieser Ansatz ist machbar, aber es erfordert beide Prozesse, um einen Socket zu öffnen.

Ein anderer Ansatz ist die Verwendung von Signalen. Es gibt 2 Signale, die als "User Signals" verwendet werden können; USR1 & USR2, Sie können einen Prozess einrichten, um ein Benutzersignal abzufangen, und den anderen, um es zu senden (kill es, um genauer zu sein).

Das letzte, woran ich denken kann, ist eine Steckdose zu benutzen und (e) abzurufen. Um ehrlich zu sein, ist es genauso wie beim ersten Ansatz, aber ohne den FD über den Sockel zu teilen.