内核如何知道用户空间中netlink的存在?

时间:2017-05-19 10:21:37

标签: linux-kernel netlink

我正在研究netlink套接字,为应用程序和内核模块编写代码。内核模块将定期向用户空间应用程序发送通知。如果应用程序被杀死,内核模块不会停止发送通知。内核在应用程序被杀死时如何知道?为此,我们可以在netlink_kernel_cfg中绑定和取消绑定用户吗?我搜索了很多,但没有找到相关信息。

1 个答案:

答案 0 :(得分:1)

在Linux中杀死任何应用程序时,将关闭所有文件描述符(包括套接字描述符)。为了在应用程序关闭netlink套接字时通知您的内核模块,您需要在 struct netlink_kernel_cfg .unbind 操作>

包含/ LINUX / netlink.h

/* optional Netlink kernel configuration parameters */
struct netlink_kernel_cfg {
        unsigned int    groups;
        unsigned int    flags;
        void            (*input)(struct sk_buff *skb);
        struct mutex    *cb_mutex;
        int             (*bind)(struct net *net, int group);
        void            (*unbind)(struct net *net, int group);
        bool            (*compare)(struct net *net, struct sock *sk);
};

在模块中设置配置参数:

struct netlink_kernel_cfg cfg = {
        .unbind = my_unbind,
};

netlink = netlink_kernel_create(&my_netlink, ... , &cfg);

要了解如何使用它,请注意netlink协议族proto_ops定义中的以下片段:

static const struct proto_ops netlink_ops = {
        .family =       PF_NETLINK,
        .owner =        THIS_MODULE,
        .release =      netlink_release,
在关闭套接字时调用

.release (在您的情况下,由于应用程序被杀死)。

作为清理过程的一部分, netlink_release() 具有以下实施方式:

<强>净/网络链路/ af_netlink.c

       if (nlk->netlink_unbind) {
                int i;

                for (i = 0; i < nlk->ngroups; i++)
                        if (test_bit(i, nlk->groups))
                                nlk->netlink_unbind(sock_net(sk), i + 1);

在这里你可以看到,如果提供了可选的 netlink_unbind ,那么它将被执行,当你的应用程序关闭套接字时(优雅地为你提供回调)或者被杀害的结果。)