2016-08-29 24 views
0

ユーザプロセスからsendmsg APIコールを呼び出すと、入力関数が呼び出され、カーネルにメッセージが送信されました。しかし、recvmsg API呼び出しを呼び出すと、再度入力関数が呼び出されますか?私はこの例を見て、評判がないのでコメントできません。その投稿のタイトルは: "どのようにnetlinkソケットを使用してカーネルモジュールと通信するのですか?"だから誰もその例を見て、カーネルソケットに書き込んだり読み込んだりするのを見分ける方法を教えてもらえますか?カーネルのNETLINK入力関数

+0

私たちがsendmsg API呼び出しを呼び出すと、それはnlmsg_unicast()も呼び出したことになりますので、次にrecvmsg()を呼び出すと、カーネルからメッセージが取得されます。それはポイントですか? – Bratic

答えて

0

なぜ入力機能が再び呼び出されるのですか? が送信し、recvmsg()を受信します。 hello_nl_recv_msg()は、カーネルモジュールがメッセージを受信したときにのみ実行されます。

この例では、ユーザー空間プログラムはsendmsg()関数を使用してメッセージAをカーネルに送信します。

メッセージがカーネルに到着しました。カーネルはhello_nl_recv_msg()を呼び出します。メッセージは、引数skbにカプセル化されています。

カーネルモジュールは、プロセスIDがskbを送信したプロセスに応答を送信することを選択します。メッセージBを作成します。カーネルモジュールはnlmsg_unicast()機能を使用してメッセージBをユーザー空間に送信します。

メッセージ機能中にユーザスペースにBが表示されます。 (ユーザ空間プログラムのプロセスIDはカーネルモジュールが書いたものと同じなので)

recvmsg()カーネルへのメッセージが受信されるまでスリープするので、カーネルがすでに応答しているかどうか心配する必要はありませんその関数を呼び出す前に。