私はオープン、クローズ、リード、ライトの各動作をサポートするlinuxカーネルモジュールを作ろうとしています。 だから、これらの関数をstruct file_operationsで登録したいのですが、構造体に「close」エントリが見つかりません。 私は 'close'の代わりに 'release'を使うべきだと思いますが、なぜ名前が 'release'で、 'close'ではないのだろうか?Linuxカーネルのclose関数が `struct file_operations`でreleaseと呼ばれるのはなぜですか?
答えて
ファイルが複数回開かれる可能性があるため、ディスクリプタを閉じると、ファイルへの最後の呼び出しでのみ、releaseが呼び出されます。だから、近いと解放の違いがあります。
リリース:このファイルの最後に近い(2)で呼ばれる、すなわちとき [ファイル] - > [f_count(FS/file_tableを参照してくださいint型を返すよう定義されますが、戻り 値はVFSによって無視されて0になります。 c:__ fput())。 more
mmapはファイルへの参照を増やすことにも注意しましょう。 open、mmap、closeシーケンスはすぐに呼び出されるリリースではなく、munmapが呼び出されたときに発生します。 – auselen
私は同様の混乱がありました。 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. "struct file_operations"引数は何ですか?
- 2. Linuxカーネル:マルチプロセッサシステムのschedule()関数
- 3. 2.6 Linuxカーネルの_stextと_etext - カーネルモジュールがそれらにリンクできないのはなぜですか?
- 4. Linuxではclose()がfsync()を呼び出しますか?
- 5. Cでは、なぜ関数ポインタが関数呼び出しの方が適しているのですか?
- 6. ファイルの作成中に、struct file_operationsとstruct fileがいつ接続されますか?
- 7. numpyベクトル化関数が余分な時間と呼ばれるのはなぜですか?
- 8. jQueryで関数が2回呼び出されるのはなぜですか?
- 9. 「タイプクラス」は「タイプクラス」と呼ばれるのはなぜですか?
- 10. Linuxカーネルのkzalloc_nodeのメモリノードとは何ですか?
- 11. 私の関数が呼び出されないのはなぜですか?
- 12. 私の `load`関数が呼び出されないのはなぜですか?
- 13. Linuxのドライバで、kfreeが機能しないのはなぜですか?データポインタが関数に渡されると、どうしてですか?
- 14. なぜMatlabの匿名関数は匿名と呼ばれていますか?
- 15. Linuxカーネルでは
- 16. なぜ、ブールは「フラグ」と呼ばれるのですか?
- 17. Linuxカーネル3.0以降でsuper_operations.read_inodeがキャンセルされるのはなぜですか?新しいリファレンスのリクエスト〜
- 18. rpbとrspが汎用レジスタと呼ばれるのはなぜですか?
- 19. linuxに複数のfcntl.hがあるのはなぜですか?
- 20. Javaの「最高」のスーパークラスが「オブジェクト」と呼ばれるのはなぜですか?
- 21. Javaのユーザーレベルのスレッドが「グリーン」と呼ばれるのはなぜですか?
- 22. PublishがXNAのReleaseより速いのはなぜですか?
- 23. 関数呼び出しで引用される変数は、なぜですか?
- 24. なぜ私の関数が呼び出されないのですか?
- 25. なぜcでundefined structを使用できるのですか
- 26. なぜglibcバイナリがlibc.so.6と呼ばれるのではなく、libc.so.1またはlibc.so.4と呼ばれていますか?
- 27. なぜこれを不変の `struct`にすることができますか?
- 28. 「wchar_t」ではなく「wchar_t」と呼ばれるのはなぜですか?
- 29. コンパイラ固有のディレクティブがプラグマと呼ばれるのはなぜですか?
- 30. ActionScript 2でどのような関数が別の関数と呼ばれるのかを調べるにはどうすればよいですか?
なぜ「リリース」ではなく「クローズ」と呼ばれているのかを尋ねていますか? – cnicutar
はい、タイトルを修正しました。 –