/ procのレーンでの実装ファイル

すべての使用/ PROCモジュールは、正しい関数を定義するためには<linux / proc_fs.h>を含むべきです。

 

プロセスは、(readシステムコールを使用して)ファイルを読み込むと、読み取り専用の/ procファイルを作成するには、あなたのドライバが。ファイルが読み込まれたときにデータを生成する機能を実装する必要があり、あなたが到着したこの汎用モジュールによって要求。我々この機能を見て、この章で後述の登録インタフェースを議論します。

 

あなたは、プロセス/ procファイルを読み込むときは、カーネル(つまり、PAGE_SIZEのバイト)のメモリのページを割り当て、ドライブがお使いの関数がread_procと呼ばれていることを渡すために戻ってユーザ空間のバッファにデータを書き込むことができます方法:

 

(オフセット異なりoff_tのchar *ページ、文字**開始、int型の数、int型*のEOF、void *型データ)INT(* read_proc)。

 

ページポインタ、あなたのデータをバッファリング書き込み、起動この機能は、(以下この詳細)ページに書き込むために関連するデータのために使用され;.オフセットとにreadメソッドの引数EOFポイントのと同じ意味を持って数えます整数は、データが特定のデータポインタドライブでこれ以上のデータ復帰することを示すために、ドライバによって設定しなければならない、あなたは、内部目的のために使用することができます。

 

別のファイルを読み取るために、同じ方法で作られたこの機能は、実際にページバッファデータに配置されるバイト数を返す。他の出力値は、EOF *であり、*開始。EOFは簡単フラグであるが、開始値がいくつかは、複雑な使用しています。その目的は、大規模な(複数の)/ procファイルを達成するのを助けるためにあります。

 

非伝統的な開始パラメータの使用方法のいくつか。その目的は、(どのページ)は、データの場所を明示することで、ユーザーに返されます。あなたのproc_readメソッドを呼び出すときは、*スタートはNULLになります。あなたはNULLにそれを維持した場合、カーネルはそのデータを前提としていオフセット入れているページは0である。つまり、それは代わりに、あなたは* NULL以外の値を設定するために開始し、場合パラメータを相殺するために注意を払っていない、ページに仮想ファイルの内容全体を置いシンプル志向proc_readバージョンを、前提としています。カーネルは、データが*設定されたオフセット、およびユーザーに直接戻ること準備ができました。一般的に、方法は、データの簡単なproc_read少量だけ起動無視返します。より洗練された方法を検討開始で指されると信じて

*ページを起動し、要求されたデータのみどこからずれて配置され始めます。

 

別の大きな問題は/ procファイルにまだいくつかの距離、それはまた、スタートにお答えしていきます。カーネルデータ構造の時には、ASCII表現読み取り処理がコールから次のデータの矛盾を見つけることができるので、呼び出し読ん連続的に変化します*スタートは小さな整数値に設定されている場合、f_posに内部番号があなたのread_procプロセスを記録するように。場合は、例えば、あなたの場合、あなたのリターンに依存しないデータの呼び出し元filp- <f_pos量だけインクリメントされますread_proc関数は、構造体の大規模な配列からの情報を返し、最初の呼び出しは、呼び出しが同じオフセット番号を提供するように*開始が5に設定することができ、構造5を返し、知っている第六の駆動構造は、アレイから返さそれは、その作者FSは/ procに見られ、「ハック」、CAN / generic.cに入院しました。

 

大/ procファイルを達成するためのより良い方法があることに注意してください。それがseq_fileと呼ばれ、我々はすぐにそれを最初に説明します、しかし、それは例えば時間以下がために実現し、単純な(やや醜い)read_procです。スカルデバイス:

 

 

67

 

 

 

(オフセット異なりoff_tするchar * bufは、文字**開始、int型の数、int型*のEOF、void *型データ)int型のscull_read_procmem

{

int型I、J、LEN = 0;

int型の制限=カウント - 80。/ * *これ以上を印刷しないでください/

 

[I] {構造体scull_dev * D =&scull_devices(iは++; I <scull_nr_devs && LEN <=限度I = 0)ため、

構造体scull_qset * QS = D->データ; もし(down_interruptible(&D-> SEM))

-ERESTARTSYSを返します。

LEN + =はsprintf(BUF + LEN、 "\ nDevice%I:QSET%I、Qの%I、SZの%のLiを\ n"、I、D-> QSET、D->量子、D->サイズ)。用(; QS && LEN <=リミット; QS = QS->次){/ *リストをスキャン/

LEN + =はsprintf(BUF + LEN、 "%pの項目、%Pの\ nでQSET"、QS、QS->データ)。(QS->データ&&!QS->次の)場合は/ * *最後の項目のみをダンプ/

{(J ++; J <D-> QSET J = 0)のための

IF(QS->データ[J])

LEN + =はsprintf(BUF + LEN、 "%の4I:%8Pを\ n"、J、QS->データ[J])。

}

}

アップ(&scull_devices [I] .sem)。

 

}

* EOF = 1。LENを返します。

 

}

 

これはかなり典型的read_proc実装です。これは、複数のデータを生成し、したがって、スタートを無視し、値をオフセットする必要がないことを前提としています。しかし、念のために、そのキャッシュをカバーしないように注意です。

おすすめ

転載: www.cnblogs.com/fanweisheng/p/11106368.html