【问题标题】:Is there a C function to get permissions of a file?是否有 C 函数来获取文件的权限?
【发布时间】:2013-12-12 20:00:22
【问题描述】:

我正在编写一个在 UNIX 上运行的 c 程序,并尝试使用 chmod 命令。查阅手册页后,我知道 chmod 需要两个参数。第一个是权限位,第二个是要更改的文件。我想对文件的当前权限位和用户输入的位进行按位或运算,并将其提供给 chmod() 以更改文件的权限。

我找到了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 是一个 long,用于保存用户输入的八进制转换。

是否/是否有任何其他函数可以返回给定文件的权限位?

编辑:缺少右括号

【问题讨论】:

  • C 中没有任何东西可以做到这一点。它是特定于实现的。
  • stat() 的 st_mode 字段可能会有所帮助...
  • @Quirliom +1 谢谢,几分钟前我找到了 stat() 函数。现在试图弄清楚如何从 stat 结构中获取 st_mode 字段以传递给 chmod()
  • @trawww 看我的回答。

标签: c unix permissions strtol


【解决方案1】:

可以使用 stat 函数返回的结构的 st_mode 字段来确定权限位。可以使用常量 S_IRUSR(用户读取)、S_IWUSR(用户写入)、S_IRGRP(组读取)等来提取各个位。

例子:

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

就将 this 传递给 chmod 而言,mode_t 只是 uint_32 的 typedef,所以应该足够简单。

【讨论】:

  • 刚刚在我的程序上试了一下,一切似乎都按我的意愿工作。在调用 stat 并检索位之后,我调用:chmod(argv[2], bits | octalPermissionBits); 并得到我正在寻找的输出。谢谢!
【解决方案2】:

可以使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2020-06-10
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多