【问题标题】:How to read linux file permission programmatically in C/C++如何在 C/C++ 中以编程方式读取 linux 文件权限
【发布时间】:2012-02-07 10:28:19
【问题描述】:

如何以编程方式读取 linux 文件权限,而不是使用“ls”然后解析结果。

【问题讨论】:

    标签: c++ c linux io


    【解决方案1】:

    这是一个C语言函数,以字符串格式“rwxr-r--”返回文件权限

    char* permissions(char *file){
        struct stat st;
        char *modeval = malloc(sizeof(char) * 9 + 1);
        if(stat(file, &st) == 0){
            mode_t perm = st.st_mode;
            modeval[0] = (perm & S_IRUSR) ? 'r' : '-';
            modeval[1] = (perm & S_IWUSR) ? 'w' : '-';
            modeval[2] = (perm & S_IXUSR) ? 'x' : '-';
            modeval[3] = (perm & S_IRGRP) ? 'r' : '-';
            modeval[4] = (perm & S_IWGRP) ? 'w' : '-';
            modeval[5] = (perm & S_IXGRP) ? 'x' : '-';
            modeval[6] = (perm & S_IROTH) ? 'r' : '-';
            modeval[7] = (perm & S_IWOTH) ? 'w' : '-';
            modeval[8] = (perm & S_IXOTH) ? 'x' : '-';
            modeval[9] = '\0';
            return modeval;     
        }
        else{
            return strerror(errno);
        }   
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 使用字符数组而不是动态内存分配,因为内存正在被释放。
    • 没有解释的工作代码比没有代码的解释更有价值。 (也许。)
    【解决方案2】:

    stat(2) 系统调用返回一个包含st_mode 成员的struct stat。这是ls -l 显示的模式位。

    在我的系统上,man 2 stat 页面显示:

       The following flags are defined for the st_mode field:
    
       S_IFMT     0170000   bitmask for the file type bitfields
       S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO
       S_ISUID    0004000   set UID bit
       S_ISGID    0002000   set-group-ID bit (see below)
       S_ISVTX    0001000   sticky bit (see below)
       S_IRWXU    00700     mask for file owner permissions
       S_IRUSR    00400     owner has read permission
       S_IWUSR    00200     owner has write permission
       S_IXUSR    00100     owner has execute permission
       S_IRWXG    00070     mask for group permissions
       S_IRGRP    00040     group has read permission
       S_IWGRP    00020     group has write permission
       S_IXGRP    00010     group has execute permission
       S_IRWXO    00007     mask for permissions for others (not in group)
       S_IROTH    00004     others have read permission
       S_IWOTH    00002     others have write permission
       S_IXOTH    00001     others have execute permission
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2010-11-05
    • 2019-03-25
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多