netlink ソケットに関するいくつかの記事を読んだ後、この回答をNetlink SOに採用しようとしました。
ユーザー空間プログラムに無限ループを追加しました。
while (1) {
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
iov.iov_base = (void *)nlh;
iov.iov_len = NLMSG_SPACE(MAX_PAYLOAD);
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
ret = recvmsg(sock_fd, &msg, 0);
if (ret == 0) {
printf("Exit.\n");
exit(0);
}
else if (ret == -1) {
perror("recvmsg:");
exit(1);
}
printf("%s", NLMSG_DATA(nlh));
}
より多くのメッセージを取得するには (リンクされた回答のプログラムは、メッセージを 1 つ受信すると停止します)。
また、カーネル モジュールにタイマーを追加しました。これは、カーネル モジュールからユーザー空間プログラムに 60 秒ごとにメッセージを送信します (次のステップは、応答を返すことです)。メッセージを送信するだけでなく、printk を使用してカーネル ログに書き込み、カーネル モジュールがまだ有効かどうかを確認しているため、これは機能します。
私のユーザー空間プログラムは現在メッセージをリッスンしていますが (そうであることを願っています)、カーネルから送信された時間指定メッセージを受信していません。
だから私の質問は、両側のソケットを開いたままにして、ユーザー空間プログラムがカーネルモジュールによるメッセージをリッスンできるようにすることは可能ですか?