簡體   English   中英

open(name,O_CREAT | O_DIRECTORY,mode)的預期行為是什么?

[英]What's the expected behavior of open(name, O_CREAT|O_DIRECTORY, mode)?

盡管仔細閱讀了相關的標准文檔 ,但是當使用包含O_CREAT|O_DIRECTORY標志調用open系統調用時,我無法理解POSIX兼容系統中的預期行為。

該標准規定了

如果設置了O_CREAT和O_DIRECTORY 請求的訪問模式既不是O_WRONLY也不是O_RDWR,則結果未指定。

但是,它既沒有指定系統的行為(O_CREAT|O_DIRECTORY|O_WRONLY)也沒有指定(O_CREAT|O_DIRECTORY|O_RDWR) 確實(據我所知), EISDIR上的行為僅適用於現有目錄。

在與O_CREATE相關的部分中,標准指定當命名文件不存在時,

如果未設置 O_DIRECTORY,則應將文件創建為常規文件; [...]

但同樣沒有說明如果設置O_DIRECTORY會發生什么。

我看過NetBSD (非常關心POSIX兼容性)和Linux (這是一個廣泛使用的系統,盡管實際上並不是POSIX)的手冊頁,但我找不到任何澄清。

說兩個標志的使用是否未指定是否正確? 如果是這樣,最常見的行為是什么?

在任何符合POSIX標准的操作系統上open(name, O_CREAT|O_DIRECTORY, mode)是否open(name, O_CREAT|O_DIRECTORY, mode)等同於mkdir

我認為你誤解了O_DIRECTORY的含義。 這不是創建目錄,而是確保open(2)的“文件”是一個目錄。

O_DIRECTORY
如果path解析為非目錄文件,則失敗並將errno設置為[ENOTDIR]。

這正是POSIX如何記錄它(如上所述)。

但是它沒有指定系統的行為(O_CREAT | O_DIRECTORY | O_WRONLY)和(O_CREAT | O_DIRECTORY | O_RDWR)

O_CREAT|O_DIRECTORY|O_WRONLYO_CREAT|O_DIRECTORY|O_RDWR的行為分別等同於O_CREAT|O_WRONLYO_CREAT|O_RDWR前提是路徑名 (open(2)的第一個參數)是目錄。 O_DIRECTORY的存在是為了確保打開的文件是一個目錄 - 它不會影響任何其他內容。

說兩個標志的使用是否未指定是否正確? 如果是這樣,最常見的行為是什么?

它表示特定組合 O_CREAT | O_DIRECTORY的行為 O_CREAT | O_DIRECTORY未指定; 並不意味着使用單個標志(有或沒有其他標志)是未指定的。

在任何符合POSIX標准的操作系統上,是否打開(名稱,O_CREAT | O_DIRECTORY,模式)等同於mkdir?

一點也不。 這就是為什么它沒有具體說明 在Linux上, 它肯定不是 - 創建一個常規文件:

當在flags中指定O_CREAT和O_DIRECTORY並且pathname指定的文件不存在時,open()將創建一個常規文件(即忽略O_DIRECTORY)。

要創建目錄,請使用mkdir(2)

netbsd本身在vn_open中包含以下內容:

if ((fmode & (O_CREAT | O_DIRECTORY)) == (O_CREAT | O_DIRECTORY))
        return EINVAL;

所以與這兩個人的任何組合都會被直接拒絕。

在Linux中它有點多毛,但任何瑣碎的測試都會告訴你目錄也沒有創建,但你最終可能會得到一個文件

對於踢,我也檢查了freebsd,它最終從未以O_DIRECTORY創建任何東西

如果你正在尋找的是一個讓你回到fd的mkdir,我恐怕沒有那種東西。 另一方面,你應該能夠安全地打開O_DIRECTORY你所做的任何事情。

到目前為止的答案都不正確。 實現可以通過O_CREAT|O_DIRECTORY|O_WRONLYO_CREAT|O_DIRECTORY|O_RDWR自由支持目錄創建,但它們不是必需的。 這在2014年得到澄清,正如您在奧斯汀組錯誤跟蹤器中看到的那樣:

open("/path/to/existing/directory", O_CREAT)應該使用EISDIR失敗,但是應該允許實現支持通過open("/path/to/directory", O_CREAT|O_DIRECTORY)創建和打開目錄延期

具有以下基本原理:

該標准未指定在現有目錄上使用O_CREAT|O_RDONLY (或O_CREAT|O_SEARCH )調用open()時的行為。 此外,某些系統希望允許使用open()函數創建目錄。 這應該是允許的,但不是必需的擴展。

您從當前版本的標准中引用的措辭

如果設置了O_CREAT和O_DIRECTORY且請求的訪問模式既不是O_WRONLY也不是O_RDWR,則結果未指定。

正是允許它做出的改變之一。

正如Rich Felkner所描述的那樣 ,允許這樣做的原因之一是,它將提供一個用於自動創建和打開目錄的接口。

但是,我不知道,如果有任何POSIX實現確實通過open提供目錄創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM