2017-05-30 4 views
0

Ich bin ein Neuling für Linux. Ich habe zwei User-Space-Prozesse, A und B, und B muss Nachrichten von A empfangen, etwas verarbeiten und ack wenn getan. Ich schaute mir also ein Zwei-Wege-Messaging-Protokoll an und sah, dass Netlink für die Kommunikation zwischen Benutzer und Kernel-Space verwendet wurde. Gibt es eine Möglichkeit, Netlink für die Kommunikation von zwei Benutzerraumprozessen zu verwenden?Gibt es eine Möglichkeit, Netlink für Interprozesskommunikation (IPC) zwischen zwei Benutzerraumprozesse zu verwenden?

Wenn es keine ideale Lösung ist, gibt es einen anderen Weg, dies zu erreichen? Ich habe Nachrichtenwarteschlangen betrachtet, aber sie scheinen ein Einweg-Kommunikationsmechanismus zu sein.

Antwort

0

Vorausgesetzt, Sie haben ein bisschen Code im Kernel zu set up the channel an erster Stelle, ist es möglich, generische netlink für Kernel⇆kernel, Kernel⇆user und Benutzer⇆user-Kommunikation zu verwenden. In der Quelle libnl gibt es ein Beispiel libnl/tests/test-genl.c, das eine Nachricht an den Kernel sendet und eine Nachricht davon empfängt. Es würde genauso gut funktionieren, wenn der andere Endpunkt ein anderer Userspace-Prozess wäre.

Es wäre jedoch viel einfacher (und portabler) UNIX-Domain-Sockets oder D-Bus für die Benutzerkommunikation zu verwenden.

+0

Vielen Dank für die Erklärung! Nach den Kommentaren sieht es so aus, als wäre Unix Domain Sockets eine bessere Lösung für meinen Fall, ich werde es mir ansehen. – HackX123

0

Netlink wurde ursprünglich entwickelt, um Kernel-Userspace-Kommunikation bereitzustellen. Es gibt keinen Grund, warum es nicht für die Userspace-Userspace-Kommunikation verwendet werden kann, aber das heißt, ich sehe nicht, warum Sie das tun würden.

Wenn Sie fortfahren und es verwenden möchten, können Sie dies ausschließlich im Benutzerbereich tun. Es ist nicht erforderlich, zuerst das Setup im Kernel-Space auszuführen. Rufen Sie einfach socket() mit einer Socket-Familie von AF_NETLINK auf. Um eine Nachricht zu senden, füllen Sie eine Struktur sockaddr_nl und setzen Sie die Eigenschaft nl_pid entsprechend (dies wird im Allgemeinen auf die PID des aktuellen Prozesses gesetzt), dann rufen Sie sendto() auf. Ein Standard recv() -Aufruf kann zum Empfangen von Nachrichten verwendet werden.

Alles, was gesagt, und vorausgesetzt, dass Sie sagen, Sie sind neu in Linux, würde ich vorschlagen, dass Sie Unix-Domain-Sockets für Ihre Userspace IPC Bedürfnisse suchen, da ich vermute, dass es Ihre Anforderungen erfüllen würde und im Allgemeinen einfacher zu bedienen sein sollte. Sie könnten auch Nachrichtenwarteschlangen betrachten, die in manchen Fällen recht gut funktionieren. Es gibt einen schönen Vergleich hier: Which is better for local IPC, POSIX message queues (mqueues) or Unix domain (local) sockets?. Beachten Sie, dass Sie eine Verknüpfung mit der Echtzeitbibliothek (librt) herstellen müssen, um POSIX-Nachrichtenwarteschlangen verwenden zu können. Eine bidirektionale Kommunikation unter Verwendung von Nachrichtenwarteschlangen kann leicht unter Verwendung eines Warteschlangenpaars erreicht werden, eines für jede Richtung.

+0

Vielen Dank für Ihre ausführliche Erklärung! Ich werde auf jeden Fall Unix Domain Sockets für meine Zwecke betrachten. – HackX123

Verwandte Themen