Permissions
打開帶有 O_WRONLY 標誌但沒有寫入權限的文件
我注意到可以
open(...)
使用帶有O_CREAT|O_WRONLY
標誌但帶有0400
模式(即沒有w
)的文件,然後將數據寫入文件並關閉它。這對我來說有點矛盾,但我可以理解它是如何工作的。
但是,我最近在 CIFS 掛載的文件系統中遇到了這種方法的問題。
現在我很好奇以下兩種說法中哪一種是正確的:
- 這在技術上(POSIX)是一個“不受支持/未記錄”的功能,恰好在某些文件系統上工作。
或者
- 它在 CIFS 上不起作用的事實是 CIFS 實施方式的一個缺點。
我一直在尋找權威的答案,但找不到。對一些官方 POSIX 標準的引用會很棒。
我注意到可以使用 O_CREAT|O_WRONLY 標誌打開(…)一個文件,但使用 0400 模式(即沒有 w),然後將數據寫入文件並關閉它。
這與更改權限位不會影響已打開文件描述符的訪問是一致的。從概念上講,您可以想像使用權限創建文件
0600
,然後以只寫模式打開它,然後將權限更改為0400
. 只是系統以原子方式完成所有這些操作,而不會讓其他程序也打開它以在中間寫入。我看不到系統呼叫的描述
open()
明確說你可以這樣做,但我認為它暗示瞭如何O_WRONLY
控制打開的 fd 獲得的權限,並且 distinct mode參數控制設置為創建文件的權限位。兩個不同的東西,它並沒有說它們需要以任何方式關聯。此外,EACCES 的描述說:
$$ EACCES $$ 路徑前綴的某個組件被拒絕搜尋權限,或者文件存在並且oflag指定的權限被拒絕,或者文件不存在並且要創建的文件的父目錄被拒絕寫權限,或者O_TRUNC是指定和寫權限被拒絕。
即權限位僅適用於已經存在的文件。但是我不確定人們可以在多大程度上合理地假設列出的標準錯誤條件可能是唯一可能的錯誤條件。
就 CIFS 來自一個有些不同的傳統而言,我不認為這是它與“傳統”Unixy 文件系統或 POSIX 規範不同的唯一方式。