2012-05-15 50 views
1

剛開始學習一些基本的C並在Linux上調試stat()系統調用。Linux C stat()八進制權限掩碼,連接發送到函數?

所以st_mode從stat()返回的結構是一個位域。我只能通過printf("octal %o", st.st_mode)獲得八進制權限,但我只對位域中的某些標誌感興趣,即S_IRWXU, S_IRWXG and S_IRWXO將該值發送給另一個函數,例如:mkdir。

這是我的示例程序。
忽略這樣一個事實,即這是一個垃圾程序,其目錄是硬編碼的,沒有作爲參數傳遞給create_dir()函數並且沒有錯誤檢查。

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

static int create_dir(mode_t mode) { 
    mkdir("/home/user/blahnew", mode); 
} 

main() { 
    struct stat st; 
    int res; 
    res = stat("/home/user/blah", &st); 

    printf("user %o\n", st.st_mode & S_IRWXU); 
    printf("group %o\n", st.st_mode & S_IRWXG); 
    printf("other %o\n", st.st_mode & S_IRWXO); 

    create_dir(mode); 

    return 0; 
}

我怎麼可以在st.st_mode只以上flages並把它作爲一個八進制來create_dir()由一個mkdir()功能可以使用?

如果我只是做了create_dir(st.st_mode)會不會也通過所有其他標誌mkdir()不需要... uid,gid,sticky bit等?

乾杯,B

回答

4

在你的代碼的工作你已經做了99%。當你說

st.st_mode & S_IRWXU 

只有位st.st_mode存在於掩碼保持S_IRWXU。所以你想要的是一個不同的位掩碼結合其他三個:

st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO) 
+0

砰!這就是我所缺少的,一種加入位掩碼標誌的方法。我知道必須有一種方式,比我想象的要容易得多!謝謝! – batfastad

+0

很高興幫助。您可以看到按位OR將如何設置其他掩碼中存在的任何位。如果這回答你的問題,你能把這個標記爲接受嗎? –

+0

完成。你的回答太快,我必須等幾分鐘才能接受! – batfastad