我對目錄權限有一個奇怪的問題。
在 C++ 應用程式中,我會建立一個資料夾:
mkdir( "foldername", 777 );
但是當我嘗試在該資料夾中建立文件時遇到問題,fopen()
返回NULL
並errno
告訴我Permission denied
。所以我檢查了,確實,我對創建的資料夾具有以下權限:dr----x--t
(根資料夾有drwxrwxr-x
)
我查了一下,這個不尋常的t
意思是“暫時的”,但我不知道這意味著什麼。
chmod 777 foldername
從 shell 完成這項工作並將屬性設為drwxrwxrwx
,但我無法每次都手動執行此操作。
問題: 有什麼線索嗎?為什麼我的應用程式無法正確設定資料夾屬性?這個「臨時」屬性的意思是什麼?
(系統是Ubuntu 12.04)
答案1
t
不是“臨時的”,這意味著粘滯位已設定。從man ls
:
t [表示] 黏滯位元已設定(模式 1000),並且可搜尋或可執行。 (請參閱 chmod(1) 或 Sticky(8)。)
黏滯位在這裡設定是因為你設定了小數777(八月 1411),不是八進位777(十進制 511)。您需要編寫0777
使用八進制,而不是777
。
mode
您還應該注意,參數 to的最終效果mkdir
也涉及與您的 umask 進行 AND 運算。從man 2 mkdir
:
參數模式指定要使用的權限。它是透過進程的umask以通常的方式修改的:建立的目錄的權限是(mode & ~umask & 0777)。
我建議,如果這影響到您,請chmod
不要mkdir
使用模式參數。
最後警告:模式 777 幾乎是絕不你真正想做的事。不要向所有使用者全域開放目錄,而是考慮在目錄上設定適當的模式和擁有者/群組。如果您需要更複雜的規則,請考慮使用 ACL。
答案2
777
因為 C 是十進制。您應該使用它0777
,以便將其視為八進制。
答案3
您可能想使用八進制數而不是十進制數:
mkdir( "foldername", 0777 );
其次,你需要檢查你的遮罩設定以確保您實際上可以建立具有這些權限的索引節點。
參考:
答案4
除了其他好的答案之外,您可以設定umask
為000
建立資料夾之前,這樣您就可以擁有所需的正確權限:
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
例子:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
筆記
您可以在下列位置使用 POSIX 巨集,而不是使用八進位模式mkdir
:
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);