2013-11-27 76 views
4

我在寫一個要在UNIX上運行的c程序,並嘗試使用chmod命令。在查閱手冊頁後,我知道chmod需要兩個參數。第一個是權限位,第二個是要更改的文件。我想要獲取文件當前權限位和用戶輸入的權限位的位或,並將其提供給chmod()以更改文件的權限。有沒有C函數來獲取文件的權限?

我找到了access()函數,但在找出如何使用它來獲取指定文件的權限位時遇到了困難。

我現在所擁有的是:

octalPermissionString = strtol(argv[1], (char**)NULL, 8); 
if(chmod(argv[2], octalPermissionString | (access(argv[2], octalPermissionString)) < 0) { 
        fprintf(stderr, "Permissions of file %s were not changed.\n"); 
       } 

其中:

的argv [1]包含由用戶將被轉換爲八進制數,然後輸入一個三位數字的十進制數的字符串中使用作爲權限位進行按位「或」運算,

argv [2]是要更改權限的文件,也是由用戶指定的。

octalPermissionString是一個很長的容納八進制轉換的用戶輸入。

是/還有其他函數可以返回給定文件的權限位嗎?

編輯:缺少結束括號

+0

C中沒有任何東西可以做到這一點。它是特定於實現的。 –

+1

stat()的st_mode字段可能有幫助... – Sinkingpoint

+0

@Quirliom +1謝謝,我幾分鐘前發現了stat()函數。現在試圖弄清楚如何將st_mode字段從stat結構中傳遞給chmod() – trawww

回答

5

權限位可以使用由統計函數返回該結構的st_mode字段來確定。

struct stat statRes; 
if(stat(file, &statRes) < 0)return 1; 
mode_t bits = statRes.st_mode; 
if((statRes & S_IRUSR) == 0){ 
    //User doesn't have read privilages 
} 

在通過這個於chmod而言,mode_t:各個位可以使用常量S_IRUSR(用戶讀取),S_IWUSR(用戶寫),S_IRGRP(組讀出)等

實施例中提取只是一個uint_32的typedef,所以應該很簡單。

+0

剛剛在我的程序中試過了,一切似乎都按照我的要求工作。在調用stat並檢索位後,我打電話: 'chmod(argv [2],bits | octalPermissionBits);' 我得到了我正在尋找的輸出。謝謝! – trawww

+1

@trawww不要忘記接受答案:) – Sinkingpoint

1

可以使用stat(2)來檢查權限,從S_ *標誌中提取信息。 這裏使用stat的函數(2):

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


int getChmod(const char *path){ 
    struct stat ret; 

    if (stat(path, &ret) == -1) { 
     return -1; 
    } 

    return (ret.st_mode & S_IRUSR)|(ret.st_mode & S_IWUSR)|(ret.st_mode & S_IXUSR)|/*owner*/ 
     (ret.st_mode & S_IRGRP)|(ret.st_mode & S_IWGRP)|(ret.st_mode & S_IXGRP)|/*group*/ 
     (ret.st_mode & S_IROTH)|(ret.st_mode & S_IWOTH)|(ret.st_mode & S_IXOTH);/*other*/ 
} 

int main(){ 

    printf("%0X\n",getChmod("/etc/passwd")); 

    return 0; 
} 
相關問題