2012-04-13 62 views
6

我正在嘗試編寫一個簡單的C程序來創建目錄(一個mkdir克隆。)。這是我到目前爲止有:如何在Posix上使用C創建具有正確權限的目錄

#include <stdlib.h> 
#include <sys/stat.h> // mkdir 
#include <stdio.h> // perror 

mode_t getumask() 
{ 
    mode_t mask = umask(0); 
    umask (mask); 
    return mask; 
} 

int main(int argc, const char *argv[]) 
{ 
    mode_t mask = getumask(); 
    printf("%i",mask); 

    if (mkdir("trial",mask) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

此代碼創建目錄與d---------,但我希望它與drwxr-xr-x創建它喜歡的mkdir呢?我在這裏做錯了什麼?

編輯: 這是對我工作的解決方案:

int main(int argc, const char *argv[]) 
{ 
    if (mkdir("trial",0777) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

根據umask設置正確的權限自動處理。所以我只需要以完全權限調用mkdir,並根據當前的umask將其切碎。

+0

診斷打印件產生了什麼?如果你在'%i'後面添加一個換行符,它可能會更好,如果你使用'%o'或'%.4o'而不是'%i',它會更容易辨認。此外,您似乎缺少聲明['umask()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html)和['mkdir()']的'#include ' (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html)。 – 2012-04-13 20:46:06

+0

它用%4o產生22。 – yasar 2012-04-13 20:47:36

回答

0

正如埃裏克說,umask是實際的許可模式,你得到的補充。因此,不應將掩碼本身傳遞給mkdir(),而應將0777-mask傳遞給mkdir()

+0

謝謝,我確實想要合併umask以獲得正確的許可。儘管我將0777-mask改爲了0777&〜mask。 :) – yasar 2012-04-13 21:13:45

+0

我實際上不需要直接使用umask,因爲顯然,mkdir已經這樣做了。因此,當我的umask爲022時,使用0777會生成一個帶有'drwxr-xr-x'的目錄 – yasar 2012-04-13 21:19:40

7

您好像誤解了umask的用途。它集/檢索進程的文件模式創建掩碼,而這又是在文件模式用於關閉位,你在電話指定一個像mkdir,像這樣(pseduo碼):

real_mode = requested_mode & ~umask 

所以在你的代碼,因爲你傳遞了umask本身的值,你最終將權限指定爲零,這正是你所看到的。

相反,你應該指定在調用你想要的權限mkdir,像這樣:

mkdir("trial", 0755) 
+3

我認爲yasar11732想要合併當前用戶的umask設置,而不是硬編碼'0755'。只是我的猜測。 – 2012-04-13 21:10:12

+1

通常不需要在應用程序中混淆用戶的umask; libc已經在'mkdir()'中爲你做了。所以硬編碼0755或0775是非常好的。 – 2012-04-13 22:45:37

+4

如果我'umask 0'怎麼辦? Hardcoding 0755將使其成爲0755而不是期望的0777.也許hardcoding 0777更爲正確,正如yasar11732所評論的,但它對'0777&〜mask'無害。 – 2012-04-13 23:17:05

相關問題