netlink简介

netlink是一种Linux内核和用户空间程序通信的方式,相比通过procfs进行通信,netlink的好处在于可以异步的由内核发送消息给用户空间而不需要用户程序轮询procfs

一个简单的例子

在内核端建立一个通信接口,接收来自用户的消息:

在用户空间连接netlink接口与内核通信:

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>


using std::cerr;
using std::endl;

int main()
{
    struct sockaddr_nl sa;
    bzero(&sa, sizeof(sa));

    sa.nl_family = AF_NETLINK;
    sa.nl_pid = getpid();
    sa.nl_groups = 0;

    int fd = socket(AF_NETLINK, SOCK_RAW, 31);
    if (fd < 0)
    {
        cerr << "Failed to create socket" << endl;
        return -1;
    }

    bind(fd, (struct sockaddr*)&sa, sizeof(sa));

    struct sockaddr_nl ksa;
    bzero(&ksa, sizeof(ksa));
    ksa.nl_family = AF_NETLINK;

    struct nlmsghdr *nh = (struct nlmsghdr) malloc(sizeof(struct nlmsghdr) + 1024);
    strcpy((char)NLMSG_DATA(nh), "hello world");
    nh->nlmsg_pid = 0;

    struct iovec iov = { nh, nh->nlmsg_len };
    struct msghdr msg = { &ksa, sizeof(ksa), &iov, 1, NULL, 0, 0 };

    sendmsg(fd, &msg, 0);
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注