カーネルをクライアントとして、カーネル モジュールとユーザー アプリケーション間の接続を確立したいと考えています。つまり、カーネルはユーザー アプリにメッセージを送信し、応答を待ち、応答を受信してから実行を続けます。
たとえば、カーネル内でメッセージを送信してから返信を待ちます。
// inside kernel
nlmsg_unicast();
wait_until_user_reply();
/* process reply */
/* continue execution.. */
ユーザーの中にいる間、
while (1) {
// inside user
recvmsg();
/* assembly reply.. */
sendmsg();
}
ただし、netlink プロトコルが行うことは、ユーザーがメッセージを送信するたびにコールバック関数を呼び出すことです。私が望むのは、カーネルがユーザーからの応答を待ってから、実行を継続することです。コールバック関数内で更新されるグローバル変数のビジー ループで待機していますか? 私は試しましたが、それはあまり良い解決策ではないと思います。
「返事が来るまで寝る」みたいなことはできますか?カーネルをスリープ状態にすることはできますか?