2017-04-18 133 views
0

幾個星期前我做了一個小項目,但最近不知何故(或者至少不像之前的工作)。什麼是創建文件時的`open()`默認權限?

它必須創建一個文件open(),並填充一些內容。

[...] 
int fd=open(filename, O_RDWR | O_CREAT); 
/* write content */ 
close(fd); 
[...] 

的問題只是,它最近沒有再創建一個具有正確的權限的文件(它與0110創建時,這個問題是存在的)

我現在知道,我只需要指定權限是這樣的:

int fd=open(filename, O_RDWR | O_CREAT, 0700); /* (for instance) */ 

但該項目仍然工作在某些計算機(沒有在OSX上工作,但在Linux上,它與0640創建沒有工作,所以它仍然工作,因爲我仍然有閱讀許可) 。

因此,這裏是我的問題:

  • 如何被那些默認權限open()功能,在文件創建定義?

(如果我沒有明確它傳遞給我的電話open()作爲參數。)

+1

你的手冊頁告訴你什麼? – Jens

+2

「[在標誌中指定'O_CREAT'時,必須提供''mode']參數*。 (強調我的)這使得它聽起來像是不確定的行爲,而當我忽略它時('--wS - S - T'),我確實會變成垃圾。 – ikegami

+0

@ikegami而這種未定義的行爲可能會導致類似[this](http://stackoverflow.com/q/2245193/6850771)。 –

回答

4

沒有默認。當您使用O_CREAT時,您必須指定它們。


根據我的系統中的文檔,

時在標誌中指定O_CREAT

(重點煤礦)[本mode]參數必須供給

這使得它聽起來像是當你不知道時它的未定義行爲當我省略它時(--wS--S--T),我確實會變成垃圾。

+0

'[open()]需要額外的參數mode_t mode;通過進程的umask值(請參閱umask(2))。' 它看起來像你說得對輸入chmod(2)描述和修改的文件與模式模式創建!我的不好,我在我的男人搜索「權限」關鍵字。 謝謝你的回答。 – vmonteco

0

您需要將模式參數指定爲包含一組位標誌的整數。例如:

int fd=open(filename, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG); 

請參閱chmod的手冊頁。該調用還使用進程umask來限制事情。