オープン、クローズ、読み取り、書き込み操作をサポートする Linux カーネル モジュールを作成しようとしています。したがって、構造体 file_operations を介してこれらの関数を登録したいのですが、構造体に「閉じる」エントリが見つかりません。'close' ではなく 'release' を使用する必要があると思いますが、なぜ名前が 'close' ではなく 'release' なのですか?
3 に答える
ファイルは複数回開かれる可能性があるため、記述子を閉じるときは、ファイルへの最後の参照に対する最後の close 呼び出しでのみ release が呼び出されます。したがって、クローズとリリースには違いがあります。
release: このファイルの最後の close(2) で、つまり file->f_count が 0 に達したときに呼び出されます。int を返すように定義されていますが、戻り値は VFS によって無視されます (fs/file_table.c:__fput() を参照)。もっと
私も同様の混乱がありました。close が呼び出されたときに release が呼び出されないという点で Perreal は正しいです。これは本Linux Device Drivers 3rd editionからの抜粋です:
int (*flush) (struct file *);
フラッシュ操作は、プロセスがデバイスのファイル記述子のコピーを閉じるときに呼び出されます。デバイスで未処理の操作を実行 (および待機) する必要があります。これを、ユーザー プログラムが要求する fsync 操作と混同しないでください。現在、フラッシュはネットワーク ファイル システム (NFS) コードでのみ使用されます。フラッシュが NULL の場合、単に呼び出されません。
int (*release) (struct inode *, struct file *);
この操作は、ファイル構造が解放されるときに呼び出されます。オープンと同様に、リリースが欠落している可能性があります。
release は、プロセスが close を呼び出すたびに呼び出されるわけではないことに注意してください。ファイル構造が共有されるときはいつでも (たとえば、fork や dup の後)、すべてのコピーが閉じられるまで release は呼び出されません。コピーが閉じられたときに保留中のデータをフラッシュする必要がある場合は、flush メソッドを実装する必要があります。
release は、プロセスが close を呼び出すたびに呼び出されるわけではないことに注意してください。ファイル構造が共有されるときはいつでも (たとえば、fork や dup の後)、すべてのコピーが閉じられるまで release は呼び出されません。コピーが閉じられたときに保留中のデータをフラッシュする必要がある場合は、flush メソッドを実装する必要があります。
LDD3 (第 3 章) から取得。