私はnetlinkソケット、アプリケーションとカーネルモジュール用のコードを書いています。カーネルモジュールは定期的にユーザー空間アプリケーションに通知を送信します。アプリケーションが終了すると、カーネルモジュールは通知の送信を停止しません。アプリケーションがいつ殺されるかをカーネルがどのように知るのか?この目的のためにnetlink_kernel_cfgでユーザのバインドとアンバインドを行うことはできますか?私は多くを検索しましたが、これに関する情報は見つかりませんでした。カーネルがどのようにユーザスペース内にネットリンクが存在するかを知っていますか?
1
A
答えて
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が提供されている場合は、実行されます。プチプチがソケットを(正常にまたは殺された結果として)閉じた。
関連する問題
- 1. CUDAプログラム内にnvprofが存在することをどのように知っていますか?
- 2. 現在のビルドが安定しているかどうかをどのように知っていますか?
- 3. URLが存在するかどうかVBScriptによって
- 4. Linuxカーネルはブート時にどのドライバをロードするのかをどのように知っていますか?
- 5. カーネルはファイルが閉じていることをどのように知っていますか
- 6. カーネルとユーザー空間の間に「ネットリンク」を作成するにはどうすればよいですか?
- 7. スクリプトがサブディレクトリ内で動作するかどうかをどのように知っていますか?
- 8. ルーピングによってリスト内に値が存在するかどうか確認してください
- 9. 知っているためのヘルパーメソッドは、json行がデータベースに存在するかどうかですか?
- 10. どのようなタイプのBPBが存在するのか、バイオスはどのようにして知っていますか?
- 11. フォームコントロールがどのように存在するかを知る方法
- 12. オブジェクトがJSON内に存在するかどうかをチェック
- 13. スクリプト内にperl modが存在するかどうかのテスト
- 14. LinuxカーネルにどのようにIPアドレスが通知されますか?
- 15. ファイルが内部ストレージに存在するかどうかを確認しようとしています
- 16. usernameが既にデータベースに存在するかどうかを知るには?
- 17. iOS:メールアカウントが存在するかどうかを知る方法
- 18. セルが存在するかどうかを知る方法
- 19. カーネル空間内のアライメントされていないネットリンクのメッセージサイズを取得する
- 20. 値が署名されているかどうかをGDBはどのように知っていますか?
- 21. Soundオブジェクトが再生されているかどうかをどのように知っていますか?
- 22. 行が存在しないかどうかを知る方法?
- 23. システムスクロールバーの現在の幅はどのように知っていますか?
- 24. どのようにピクチャがピクチャボックス内にあるかをプログラムは知っていますか?
- 25. カーネルはセグメント障害についてどのように知っていますか?
- 26. イメージがデータベースに既に存在するかどうかを知る方法?
- 27. Railsは自分のスキーマに従って、この関連付けに主キーが存在することをどのように知っていますか?
- 28. Rubyはメソッドが存在することをいつ知っていますか?
- 29. 通知が既に存在するかどうかを確認する方法?
- 30. どのように知っているかマシンに依存する定数