在内核和用户端保持Netlink Socket打开

时间:2014-10-01 20:59:23

标签: c linux-kernel kernel-module netlink

在我阅读了一些关于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));
}

获取更多消息(链接应答中的程序在收到一条消息后停止)。

我还在我的内核模块中添加了一个计时器,它每隔60秒从内核模块向用户空间程序发送一条消息(下一步是:发回答案)。这是有效的,因为我不仅发送消息,而且还使用printk写入内核日志,以查看内核模块是否还活着!

我的用户空间程序现在正在侦听消息(我希望如此),但是没有得到内核发送的任何定时消息。

所以我的问题是:是否可以保持双方的套接字打开并让用户空间程序通过内核模块监听消息?

1 个答案:

答案 0 :(得分:0)

是的,双方都可以开放接收双方。