2017-05-19 7 views
1

Ich arbeite an Netlink-Sockets, geschriebenen Code für Anwendung und Kernel-Modul. Das Kernelmodul sendet regelmäßig Benachrichtigungen an die Benutzerbereichsanwendung. Wenn die Anwendung beendet wird, hört das Kernel-Modul nicht auf, Benachrichtigungen zu senden. Wie wird der Kernel wissen, wenn die Anwendung beendet wird? Können wir Benutzer in netlink_kernel_cfg für diesen Zweck binden und lösen? Ich habe viel gesucht, aber keine Informationen dazu gefunden.Wie erkennt Kernel das Vorhandensein von Netlink im Userspace?

Antwort

1

Wenn eine Anwendung unter Linux beendet wird, werden alle Dateideskriptoren (einschließlich Socket-Deskriptoren) geschlossen. Um Ihre Kernel-Modul benachrichtigt zu haben, wenn die Anwendung der netlink Buchse Sie das optionale .unbind op in struct netlink_kernel_cfg implementieren müssen geschlossen wird.

include/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); 
}; 

die Konfigurationsparameter in Ihrem Modul Set:

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

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

Um zu verstehen, wie diese genutzt werden, ist folgendes beachten Fragment aus dem netlink Protokoll Familie proto_ops Definition:

static const struct proto_ops netlink_ops = { 
     .family =  PF_NETLINK, 
     .owner =  THIS_MODULE, 
     .release =  netlink_release, 

.freigabe wird beim Schließen des Sockels aufgerufen (in Ihrem Fall aufgrund der Anwendung wird getötet).

Als Teil seiner Bereinigungsprozess, netlink_release() hat die folgende Umsetzung:

net/netlink/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); 

Hier können Sie sehen, dass, wenn die optionale netlink_unbind wurde zur Verfügung gestellt, dann wird es ausgeführt werden, bietet Ihnen einen Rückruf, wenn Ihre ap plication hat den Socket geschlossen (entweder elegant oder als Ergebnis der Tötung).

Verwandte Themen