0

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 を使用してカーネル ログに書き込み、カーネル モジュールがまだ有効かどうかを確認しているため、これは機能します。

私のユーザー空間プログラムは現在メッセージをリッスンしていますが (そうであることを願っています)、カーネルから送信された時間指定メッセージを受信して​​いません。

だから私の質問は、両側のソケットを開いたままにして、ユーザー空間プログラムがカーネルモジュールによるメッセージをリッスンできるようにすることは可能ですか?

4

1 に答える 1