2016-09-28 67 views
0

我寫下面的代碼,試圖在Linux上使用0777模式創建一個目錄:爲什麼我的程序不能用mkdir系統調用設置0777模式?

#include <sys/stat.h> 
#include <sys/types.h> 

int main() { 

    mkdir("/tmp/mkdir-test", 0777); 
    return 0; 

} 

但實際上,新目錄有0755模式。

# stat /tmp/mkdir-test 
    File: `/tmp/mkdir-test' 
    Size: 4096  Blocks: 8   IO Block: 4096 directory 
Device: 802h/2050d Inode: 1772304  Links: 2 
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) 
Access: 2016-09-27 20:23:54.000000000 -0700 
Modify: 2016-09-27 20:23:54.000000000 -0700 
Change: 2016-09-27 20:23:54.000000000 -0700 

有人可以解釋這一點嗎?該程序如何創建一個真正的0777模式目錄?

回答

6

在shell中運行umask;它會報告022。在創建文件或目錄時,將從權限中刪除umask值中設置的位。

要真正設置0777權限,您需要與umask()到丁克:

mode_t old_mask = umask(0); 
mkdir("/tmp/mkdir-test", 0777); 
umask(old_mask); 

,保留,當你確定你需要重寫它除了當前設置。


順便提及,用於設定權限另一種選擇是:

const char *dirname = "/tmp/mkdir-test"; 
if (mkdir(dirname, 0777) == 0) 
    chmod(dirname, 0777); 

chmod()功能不受umask值。撥打mkdir()的權限並不重要;如果你願意,你可以使用0。如果您試圖限制權限而不是像您的情況那樣放鬆權限,則此方法不太令人滿意 - 在mkdir()chmod()調用之間存在TOCTOU(檢查時間,使用時間)風格漏洞,在此期間有人可能進入一個放寬權限的目錄,這可能是一個安全風險。最好使用umask()方法。 umask()是一個非常簡單的系統調用,因此也非常快速(與系統調用相比,諸如open()mkdir()之類的重量級)。

+0

謝謝!有用! – walker

+0

甚至在'mkdir(3)'文檔中記錄了@walker。例如,Linux版本說:「新目錄的文件權限位應該從'mode'初始化。**'mode'參數的這些文件權限位應該由進程'文件創建掩碼**'修改(強調增加)。 –

+0

@JohnBollinger我只是試圖在mkdir之後調用chmod來解決問題。它也有效。我的問題是兩種方式有什麼不同?哪種方式更受推薦? – walker

相關問題