您正在運行的「umask」,每個進程設置犯規這掩蓋了文件和目錄的創建操作了權限位。
沒有安全的方法來禁用umask。你應該做的是創建一個模式爲零的目錄(即所有訪問被拒絕),然後使用chmod
(系統調用,而不是相同名稱的shell命令)將權限調整爲你想要的。
你的程序片段有許多其他的錯誤。這是很難全面恢復,並很可能是一個安全漏洞,如果你把它錯,所以我就寫出來了詳細正確的代碼:
int
make_directory_like(const char *to_create,
const char *prototype)
{
struct stat st;
if (lstat(prototype, &st)) {
fprintf(stderr, "lstat: %s: %s\n", prototype, strerror(errno));
return -1;
}
if (!S_ISDIR(st.st_mode)) {
fprintf(stderr, "lstat: %s: %s\n", prototype, strerror(ENOTDIR));
return -1;
}
/* create directory initially with no perms at all - this is the only
safe way to suppress the effects of the umask. */
if (mkdir(to_create, 0000)) {
if (errno != EEXIST) {
fprintf(stderr, "mkdir: %s: %s\n", to_create, strerror(errno));
return -1;
} else {
/* check whether the thing that exists is a directory */
struct stat st2;
if (lstat(to_create, &st2)) {
fprintf(stderr, "lstat: %s: %s\n", to_create, strerror(errno));
return -1;
}
if (!S_ISDIR(st2.st_mode)) {
fprintf(stderr, "mkdir: %s: %s\n", to_create, strerror(EEXIST));
return -1;
}
}
}
if (chmod(to_create, st.st_mode & ~S_IFMT)) {
fprintf(stderr, "chmod: %s: %s\n", to_create, strerror(errno));
return -1;
}
return 0;
}
練習你:
- 爲什麼這是抑制umask影響的唯一安全方法? (提示:線程,但這只是幾個原因之一)
- 爲什麼我用
lstat
而不是stat
?
- 爲什麼需要統計創建路徑如果
mkdir
失敗errno == EEXIST
?
- 爲什麼使用
chdir
這樣做不正確? (有兩個原因。)
- 爲什麼它安全繼續前進,並呼籲
mkdir
在創建路徑,當我們不知道是否已經有東西嗎?
- 爲什麼
& ~S_IFMT
必需的東西?
我會看看你的其他問題,謝謝。 – d0m1n1c
但我的老師明確說過要使用stat,爲什麼不應該我 – d0m1n1c
我可以考慮不使用chdir的唯一原因是它可能會移動我的cwd,但是我使用我修復了我發佈的段之外的內容。 – d0m1n1c