私はオープン、クローズ、リード、ライトの各動作をサポートする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. struct task_structのLinuxカーネルNUMA関連変数
- 3. Cで関数extern structを渡すのはなぜですか?
- 4. 2.6 Linuxカーネルの_stextと_etext - カーネルモジュールがそれらにリンクできないのはなぜですか?
- 5. Linuxカーネル:マルチプロセッサシステムのschedule()関数
- 6. Linuxカーネルのdm_per_bio_data関数は何をしますか?
- 7. "RELEASE"ビルドモードで例外と呼ばれる複数のJSONフィールド
- 8. Ubuntuのカーネル(VMwareは)チュートリアル以下の知るには、/usr/include/linux/fs.hファイル内の構造体file_operations構造
- 9. なぜLinuxカーネルで単一のハッシュバケットハッシュテーブルを使用するのですか
- 10. ファイルの作成中に、struct file_operationsとstruct fileがいつ接続されますか?
- 11. 受信がメソッドと呼ばれるのはなぜですか?
- 12. Linuxではclose()がfsync()を呼び出しますか?
- 13. Linuxカーネルでmemcpy()が呼び出されたときはどうすれば追跡できますか?
- 14. Cでは、なぜ関数ポインタが関数呼び出しの方が適しているのですか?
- 15. なぜLinuxカーネルのロックレスリストにヘッド構造とノード構造があるのですか?
- 16. numpyベクトル化関数が余分な時間と呼ばれるのはなぜですか?
- 17. Linuxカーネルのkzalloc_nodeのメモリノードとは何ですか?
- 18. jQueryで関数が2回呼び出されるのはなぜですか?
- 19. 「タイプクラス」は「タイプクラス」と呼ばれるのはなぜですか?
- 20. RESTはアーキテクチャスタイルと呼ばれるのはなぜですか?
- 21. Pythonの関数を呼び出すときに関数が実行されないのはなぜですか?
- 22. Javaで関数が呼び出されないのはなぜですか?
- 23. xsltで関数が呼び出されないのはなぜですか?
- 24. 9patchがなぜ9patchと呼ばれるのですか
- 25. なぜLinuxカーネルのこのコードはデッドループを起こさないのですか?
- 26. Linuxのドライバで、kfreeが機能しないのはなぜですか?データポインタが関数に渡されると、どうしてですか?
- 27. Linuxカーネルでは
- 28. 私の関数が呼び出されないのはなぜですか?
- 29. 私の `load`関数が呼び出されないのはなぜですか?
- 30. 「フォームコントロール」と呼ばれるのはなぜですか?
なぜ「リリース」ではなく「クローズ」と呼ばれているのかを尋ねていますか? – cnicutar
はい、タイトルを修正しました。 –