我正在研究netlink套接字,为应用程序和内核模块编写代码。内核模块将定期向用户空间应用程序发送通知。如果应用程序被杀死,内核模块不会停止发送通知。内核在应用程序被杀死时如何知道?为此,我们可以在netlink_kernel_cfg中绑定和取消绑定用户吗?我搜索了很多,但没有找到相关信息。
答案 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 ,那么它将被执行,当你的应用程序关闭套接字时(优雅地为你提供回调)或者被杀害的结果。)