説明は
詳しくは、man7.org/linux/man-pages/man2/open.2.html をご覧ください。
なぜopenat
必要なのかについては、次のように書かれています。
openat() allows an application to avoid race conditions that
could occur when using open() to open files in directories other than
the current working directory. These race conditions result from the
fact that some component of the directory prefix given to open()
could be changed in parallel with the call to open(). Suppose, for
example, that we wish to create the file path/to/xxx.dep if the file
path/to/xxx exists. The problem is that between the existence check
and the file creation step, path or to (which might be symbolic
links) could be modified to point to a different location.
この競合がなぜ問題になるのか理解できません。アプリがファイルの存在を確認し、存在する場合は違うファイルの場合、もちろんこれらは 2 つのステップであり、アプリはその間に何も干渉しないことを保証する必要があります。 への単一の呼び出しでopen()
競合状態が発生する可能性がある場合にのみ、 などの他のシステム コールがopenat()
必要になる可能性があります。それ以外の場合、これはシステム コールで解決できる問題ではなく、アプリケーションの責任です。
ここで私が理解していないことは何でしょうか?
答え1
競合は、現在のディレクトリにないファイルのみを参照します。openat() に渡す相対パスには、予期しているディレクトリとは異なるディレクトリを指すシンボリック リンクが含まれている可能性があります。
現在のディレクトリ内のファイルに対してのみ open() を使用すると (目的の場所にいることを確認した後に)、この問題を回避できます。