為什麼需要 openat() 來避免先使用 stat 然後使用 open() 的兩步驟競爭條件?

為什麼需要 openat() 來避免先使用 stat 然後使用 open() 的兩步驟競爭條件?

解釋位於

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() (在確保您位於您想要的位置之後),則可以避免此問題。

相關內容