既知のファイル記述子を持つ開いているファイルがある場合、 と を使用する利点は何fstat()
ですかstat()
? なぜ機能が1つしかないのですか?
int fstat(int fildes, struct stat *buf)
int stat(const char *path, struct stat *buf)
既知のファイル記述子を持つ開いているファイルがある場合、 と を使用する利点は何fstat()
ですかstat()
? なぜ機能が1つしかないのですか?
int fstat(int fildes, struct stat *buf)
int stat(const char *path, struct stat *buf)
前述のように、はファイル記述子で動作stat()
しますが、ファイル名で動作します。fstat()
そのために2つの機能があるのはなぜですか?
1つの要因は利便性であると思われます。fstat()
ファイル名を渡さなくても、コードの他の部分から取得したファイル ディスクリプタにアクセスできるのは素晴らしいことです。
ただし、主な理由はセキュリティです。最初stat()
にファイルを作成してからそれopen()
を作成すると、その間にファイルが変更された (または権限が変更されたなど) か、シンボリック リンクに置き換えられた可能性があるわずかな時間枠があります。
fstat()
その問題を回避します。最初open()
にファイルを取得すると、そのファイルを足元で交換することはできなくなります。そうfstat()
すれば、正しいファイルを持っていることを確認できます。
を見るとman fstat
、次のことがわかります。
fstat() は、stat されるファイルがファイル記述子 fd によって指定されることを除いて、stat() と同じです。
少し拡張するfstat
には、たまたまファイル パスの代わりにファイル記述子がある場合に使用します。
上記の引用からわかるように、関数によって提供される情報に関しては、それらは文字通り同一です。
ファイルへのファイル記述子しかない場合(ただし、そのパスがわからない場合があります)、fstat()
;を使用できます。ファイルへのパスしかない場合は、stat()
最初に開く必要はなく、直接使用できます。