설명은
http://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.
이 경주가 왜 문제인지 이해가 되지 않습니다. 앱이 일부 파일의 존재를 확인하고 싶다면,다른물론 이는 두 단계로 이루어지며, 앱은 그 사이에 방해가 되지 않도록 해야 하며 보장할 수 있습니다. 단일 호출로 인해 open()
경쟁 조건이 발생할 수 있는 경우에만 openat()
필요한 다른 시스템 호출이 필요할 수 있습니다. 그렇지 않은 경우 이는 시스템 호출이 해결하는 것이 아니라 애플리케이션의 책임입니다.
내가 여기서 이해하지 못하는 것은 무엇입니까?
답변1
경쟁은 현재 디렉터리에 없는 파일만 참조합니다. openat()에 전달하는 상대 경로에는 예상한 디렉터리와 다른 디렉터리를 가리키는 심볼릭 링크가 포함될 수 있습니다.
현재 디렉토리에 있는 파일에만 open()을 사용하면(원하는 위치를 확인한 후) 이 문제를 피할 수 있습니다.