【问题标题】:How to work with NETLINK_KOBJECT_UEVENT protocol in user space?如何在用户空间使用 NETLINK_KOBJECT_UEVENT 协议?
【发布时间】:2017-06-20 20:42:55
【问题描述】:

让我们考虑这个示例代码:

#include <linux/netlink.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>

#define BUF_SIZE 4096

int main() {
    int fd, res;
    unsigned int i, len;
    char buf[BUF_SIZE];
    struct sockaddr_nl nls;

    fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
    if (fd == -1) {
        return 1;
    }

    memset(&nls, 0, sizeof(nls));
    nls.nl_family = AF_NETLINK;
    nls.nl_pid = getpid();
    nls.nl_groups = 1;

    res = bind(fd, (struct sockaddr *)&nls, sizeof(nls));
    if (res == -1) {
        return 2;
    }

    while (1) {
        len = recv(fd, buf, sizeof(buf), 0);

        printf("============== Received %d bytes\n", len);
        for (i = 0; i < len; ++i) {
            if (buf[i] == 0) {
                printf("[0x00]\n");
            } else if (buf[i] < 33 || buf[i] > 126) {
                printf("[0x%02hhx]", buf[i]);
            } else {
                printf("%c", buf[i]);
            }
        }
        printf("<END>\n");
    }

    close(fd);
    return 0;
}

它在 netlink 套接字上侦听与热插拔相关的事件。基本上,它有效。但是,即使在整个晚上都在谷歌上搜索、阅读不同的文档和手册并通过示例进行操作之后,有些部分对我来说还是不清楚。

基本上,我有两个问题。

  1. sockaddr_nl.nl_groups 的不同值意味着什么?至少对于NETLINK_KOBJECT_UEVENT 协议而言。
  2. 如果为消息分配的缓冲区太小,消息将被截断(您可以使用BUF_SIZE 大小来查看)。这个缓冲区大小应该是多少才不会丢失任何数据?是否可以知道传入消息的用户空间长度以分配足够的空间?

我希望直接回答作为对内核代码的引用。

【问题讨论】:

    标签: linux-kernel netlink


    【解决方案1】:
    1. 这些值代表不同的多播组。一个 netlink 套接字可以有 31 个不同的多播组(0 表示单播),多播消息可以发送到这些组。对于NETLINK_KOBJECT_UEVENT,它看起来像是固定为1 see f.ex. here。

    2. 您应该能够使用getsockopt,将level 设置为SOL_SOCKET,将optname 设置为SO_RCVBUF。

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2023-03-10
      相关资源
      最近更新 更多