2012-07-09 15 views
9

私はオープン、クローズ、リード、ライトの各動作をサポートするlinuxカーネルモジュールを作ろうとしています。 だから、これらの関数をstruct file_operationsで登録したいのですが、構造体に「close」エントリが見つかりません。 私は 'close'の代わりに 'release'を使うべきだと思いますが、なぜ名前が 'release'で、 'close'ではないのだろうか?Linuxカーネルのclose関数が `struct file_operations`でreleaseと呼ばれるのはなぜですか?

+0

なぜ「リリース」ではなく「クローズ」と呼ばれているのかを尋ねていますか? – cnicutar

+0

はい、タイトルを修正しました。 –

答えて

11

ファイルが複数回開かれる可能性があるため、ディスクリプタを閉じると、ファイルへの最後の呼び出しでのみ、releaseが呼び出されます。だから、近いと解放の違いがあります。

リリース:このファイルの最後に近い(2)で呼ばれる、すなわちとき [ファイル] - > [f_count(FS/file_tableを参照してくださいint型を返すよう定義されますが、戻り 値はVFSによって無視されて0になります。 c:__ fput())。 more

+2

mmapはファイルへの参照を増やすことにも注意しましょう。 open、mmap、closeシーケンスはすぐに呼び出されるリリースではなく、munmapが呼び出されたときに発生します。 – auselen

4

私は同様の混乱がありました。 Perrealは、closeが呼び出されたときにリリースが呼び出されないという点で正しいです。ここでは本Linux Device Drivers 3rd editionからの抽出物である:

int (*flush) (struct file *); 

フラッシュ操作はプロセスがデバイスのファイル記述子のコピーを閉じたときに呼び出されます。デバイス上の未処理の操作を実行(および待機)する必要があります。これは、ユーザプログラムによって要求されたfsync操作と混同してはいけません。現在、フラッシュはネットワークファイルシステム(NFS)コードでのみ使用されます。 flushがNULLの場合、単に呼び出されません。

int (*release) (struct inode *, struct file *); 

この操作は、ファイル構造が解放されるときに呼び出されます。オープンと同様に、リリースは欠落する可能性があります。

リリースは、プロセスがcloseを呼び出すたびに呼び出されないことに注意してください。ファイル構造が共有されるときはいつでも(例えば、forkやdupの後)、すべてのコピーが閉じられるまでreleaseは呼び出されません。コピーが閉じられたときに保留中のデータをフラッシュする必要がある場合は、flushメソッドを実装する必要があります。

+1

単一のプロセスが同じファイルを参照する2つのファイル記述子を持つ場合、各ファイル記述子で 'close()'を呼び出すと 'release'が2回呼び出されます。 – Asblarf

+1

@Asblarfこれは、プロセスによってオープンされた各ファイル記述子のカーネル内で別の "struct file *"オブジェクトが維持されるため意味があります。 –

+0

これは、 'struct file *'が何を表していたかを詳しく見てわかりました。 – Asblarf

関連する問題