2016-08-29 4 views
0

Wenn wir sendmsg API-Aufruf von Benutzerprozess aufrufen, wird die Eingabefunktion aufgerufen und wir haben eine Nachricht an den Kernel gesendet. Ok, aber wenn wir recvmsg API-Aufruf aufrufen, wird die Eingabefunktion erneut aufgerufen? Ich habe das am Beispiel gesehen, das ich nicht kommentieren kann, weil ich keinen Ruf habe. Titel dieses Beitrags ist: "Wie netlink Socket verwenden, um mit einem Kernelmodul zu kommunizieren?" Könnte also jemand dieses Beispiel sehen und mir sagen, wie man zwischen dem Schreiben in den Kernel-Socket und dem Lesen unterscheidet?NETLINK Eingabefunktion im Kernel

+0

Ok, wenn wir sendmsg API-Aufruf aufrufen, heißt das, dass wir auch nlmsg_unicast() aufgerufen haben, also werden wir beim nächsten Aufruf von recvmsg() die Nachricht vom Kernel bekommen. Das ist der Punkt? – Bratic

Antwort

0

Warum sollte die Eingabefunktion erneut aufgerufen werden? sendmsg() sendet und recvmsg() empfängt. Die hello_nl_recv_msg() wird nur ausgeführt, wenn das Kernelmodul eine Nachricht empfängt.

In diesem Beispiel sendet das Programm UserSpace die Nachricht A mit der Funktion sendmsg() an den Kernel.

Nachricht Eine kommt zum Kernel. Der Kernel ruft hello_nl_recv_msg() auf. Nachricht Eine ist in dem Argument skb eingekapselt.

Das Kernel-Modul sendet eine Antwort an den Prozess, dessen Prozess-ID skb lautet. Er erstellt eine Nachricht B. Das Kernelmodul sendet die Nachricht B mit der Funktion nlmsg_unicast() an den Benutzerbereich.

Nachricht B erscheint im Benutzerbereich während der recvmsg()-Funktion. (Weil die Prozess-ID des Userspace-Programms dieselbe ist, an die das Kernel-Modul geschrieben hat.)

recvmsg() schläft, bis eine Nachricht an den Kernel empfangen wird, damit Sie sich keine Sorgen machen müssen, ob der Kernel bereits geantwortet hat oder nicht bevor Sie diese Funktion aufrufen.