2

私は Linux カーネル モジュールを作成していますが、proc ファイルを動的に生成し、それらを適切な方法で使用する方法があるかどうか疑問に思っていました。

a を使用して構造体を作成し、list_headそこから進むことに問題はありませんが、私の究極の問題は、まったく同じ関数を異なる変数で実行したいということです。つまり、write_procファイルごとにカーネルメモリ内の異なるバッファーに書き込む (およびread_proc同じファイルから読み取る) が必要なだけです。

私がこれに苦労している理由は、procファイルから読み書きするための関数プロトタイプがこの動作を許可していないようだからです:

int read_proc(char *buf, char **start, off_t offset, int count,
              int *eof, void *data) {

int write_proc(struct file *file, const char *buf,
               unsigned long count, void *data) {

これで、一連の関数を静的に作成し、十分に割り当てることができるようになりましたが、もっと洗練された解決策があるかどうか疑問に思っています。

ユーザーランドでどのように表示するかの例を次に示します (どこから始めればよいかわからないため、コード MWE はありません)。

$ echo "file1" > /proc/mydir/create
$ echo "file2" > /proc/mydir/create
$ ls /proc/mydir
  create  file1  file2
$ echo "1" > /proc/mydir/file1
$ echo "5" > /proc/mydir/file2
$ cat /proc/mydir/file*
  1
  5

私はちょうど深いところから抜け出しましたか?

私は非常に一般的な互換性を探しています (2.6.33+)

4

2 に答える 2

1

私の究極の問題は、まったく同じ関数を異なる変数で実行したいということです。

/proc ファイルはすでに作成できていると思います。イリヤが言ったように、create_proc_entry仕事をします(より良い代替手段がありますが)。

私がこれに苦労している理由は、procファイルから読み書きするための関数プロトタイプがこの動作を許可していないようだからです

実際にはそうです。どちらかの関数のプロトタイプを見ると:

int read_proc(char *buf, char **start, off_t offset, int count,
              int *eof, void *data);
                        ^^^^^^^^^^

int write_proc(struct file *file, const char *buf,
               unsigned long count, void *data);
                                    ^^^^^^^^^^

dataジェネリックであるというパラメータが表示されますvoid *。このパラメーターを使用すると、同じ関数を異なる変数で動作させることができます。

Nowcreate_proc_entryはこれに最適な関数ではありません。実際、これに代わるものがあります1、これは /proc 関数のより良い命名スキームにも一致します。ソースコード自体を見ると、 の署名create_proc_dataとその仕組みがわかります。この関数を使用すると、/proc ファイルの作業領域へのポインターを提供できます。このポインターは、読み取り関数と書き込み関数の両方に渡されます。

pthreadこれは、たとえば、関数ポインターをコールバックとして受け取る他の多くのライブラリーの動作と非常によく似ています。


1私が間違っていなければ、create_proc_entry非推奨です。

于 2013-04-22T13:30:57.797 に答える