0

カスタム カーネル モジュールでいくつかのdentryオブジェクトを作成しています。securityfsこれが私がやっている方法です:

inst->output_file = securityfs_create_file("1",
                               S_IRUSR | S_IRGRP, uprp_dir, NULL,
                               &my_file_ops);
inst->output_file = securityfs_create_file("2",
                               S_IRUSR | S_IRGRP, uprp_dir, NULL,
                               &my_file_ops);
// and so on 

に通常のシーケンス操作を実装しましたmy_file_ops。ただし、問題は、次の関数がすべての dentryオブジェクトに対して呼び出されることです。

 static int ct_open(struct inode *inode, struct file *file)

次に使用します:

 static void *my_seq_ops_start (struct seq_file *m, loff_t *pos)

問題は、(これらの関数のいずれかで) ユーザーが読みたい dentry オブジェクトをどのように把握するかということです。-- つまり、ファイル12.

4

1 に答える 1

1

VFS が構造体ct_open()を介して関数を呼び出すと、開いているファイルをとmy_file_opsの両方として返します。には、 によって返された dentry へのポインターであるメンバーが含まれています。ファイル名が含まれています。struct inode *struct file *struct filef_dentrysecurityfs_create_file()struct dentry

ただし、さらにクリーンなのは、 の 4 番目の引数がsecurityfs_create_file()使用するためのものです。必要な内部構造への任意のポインターを渡すことができ、オープン操作中に inode.i_private ポインターから取得できます。これは通常、抽象化の「正しい」レベルであるため、ファイル操作ではファイル名について何も知る必要はありません。

于 2013-05-06T16:27:50.907 に答える