2012-12-02 34 views
0

我想使用open()創建文件。即使已定義,也沒有寫入權限

這裏是我的代碼的一部分:

int fd = open("testing", O_EXCL | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); 
    if(fd == -1){ 
     perror("Error"); 
     return 1; } 

輸出應該是一個文件名爲「測試」被創建,具有讀,寫和用戶,組和其他執行權限。

但我得到的是一個名爲「測試」文件,用此權限:對集團

-rwxr-xr-x 

的寫權限和其他人失蹤。

我也使用

S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH |S_IXOTH) 

嘗試,但我仍然得到同樣的結果。

我該如何解決這個問題?

回答

2

權限被進程'umask修改。有效的權限是(mode & ~umask)

您應該在創建文件後使用fchmod()更改權限。 fchmod()可避免競爭條件,如果您使用chmod(),並且底層文件更改爲指向open()chmod()(谷歌用於TOCTOU競賽)之間的其他inode。

+0

因此,不鼓勵創建文件,同時設置模式? – Chin

+0

通常你應該尊重umask,然後你可以在'open()'調用中設置模式。如果你想爲特定的'open()'調用覆蓋umask,最好用一個單獨的'fchmod()'調用完成。 – ninjalj

+0

感謝您的解釋@ninjalj。 – Chin

相關問題