2017-05-19 13 views
1

私はnetlinkソケット、アプリケーションとカーネルモジュール用のコードを書いています。カーネルモジュールは定期的にユーザー空間アプリケーションに通知を送信します。アプリケーションが終了すると、カーネルモジュールは通知の送信を停止しません。アプリケーションがいつ殺されるかをカーネルがどのように知るのか?この目的のためにnetlink_kernel_cfgでユーザのバインドとアンバインドを行うことはできますか?私は多くを検索しましたが、これに関する情報は見つかりませんでした。カーネルがどのようにユーザスペース内にネットリンクが存在するかを知っていますか?

答えて

1

Linuxでアプリケーションが強制終了されると、すべてのファイル記述子(ソケット記述子を含む)が閉じられます。アプリケーションがネットリンクソケットを閉じたときに、あなたのカーネルモジュールは、通知持つために、あなたはオプションを実装する必要が構造体netlink_kernel_cfgオペアンプを.unbind。ネットリンクプロトコルから次の断片を注意し、これを使用する方法を理解するには

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

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

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

が含まれますファミリproto_opsの定義:

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

.releaseは、ソケットの終了時に呼び出されます(あなたのケースでは、アプリケーションが強制終了されるため)。

ネット/ネットリンク/

あなたがもしいることがわかります。ここ
 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); 

af_netlink.c:そのクリーンアッププロセスの一環として

netlink_release()は、次の実装を持っていますオプションのnetlink_unbindが提供されている場合は、実行されます。プチプチがソケットを(正常にまたは殺された結果として)閉じた。

関連する問題