GNU/Linux >> Linux の 問題 >  >> Linux

Linux カーネルの `struct file_operations` で close 関数が release と呼ばれるのはなぜですか?

ファイルは複数回開かれる可能性があるため、記述子を閉じるときは、ファイルへの最後の参照に対する最後の 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 メソッドを実装する必要があります。


Linux
  1. Linuxカーネルの誕生日おめでとう:あなたのお気に入りのリリースは何ですか?

  2. Linuxカーネルテストのライフサイクル

  3. Linux –イーサネットインターフェイスがEth0ではなくEnp0s10と呼ばれるのはなぜですか?

  1. Linuxターミナルでファイルをコピーする

  2. Linux – Vmlinuxヘッダーにはカーネルイメージの長さが含まれていますか?

  3. Unix/Linux システムで最も強力なユーザーが「ルート」と呼ばれるのはなぜですか?

  1. Linuxターミナルでファイルの名前を変更します

  2. Linuxターミナルでファイルを移動する

  3. Linuxで「sshpass」がファイル転送を自動化する正しい方法ではない理由