代码之家  ›  专栏  ›  技术社区  ›  Jake

Perl的文件测试操作符的C等价物是什么?

  •  0
  • Jake  · 技术社区  · 10 年前

    Perl有一个文件测试运算符列表,用于检查文件对进程的有效用户是否可读-r、可写-w或可执行-x( http://perldoc.perl.org/functions/-X.html ). 如何在C语言中执行此操作?

    if (-w $file) {
        open FH, "+<", $file or die "$!\n";
    }
    else {
        open FH, "<", $file or die "$!\n";
    }
    

    我知道libc有一个名为access()的函数,但这是针对进程的真正用户的,只对setuid程序有用。

    2 回复  |  直到 10 年前
        1
  •  3
  •   Alnitak    10 年前

    在POSIX系统上,使用 stat 函数,然后使用 S_XXX 测试标志的宏,例如:

    struct stat st;
    if (stat(file, &st) == 0 && (st.st_mode & S_IWUSR)) {
        // file exists, and is writable by "user"
        ...
    }
    

    我不知道有任何“标准”C函数可以执行相同的可写性测试,除了实际尝试打开文件并在文件不可写时检查结果错误。

    POSIX也有 access() 专门用于测试可读性和可写性,但我提到 stat() 首先,这是Perl测试试图模拟的特定函数(在大多数情况下)。

        2
  •  0
  •   Jake    10 年前

    我不能使用stat(),因为尝试模拟文件访问太复杂,而且永远不可移植。

    我不能使用access(),因为如果我在sudo下运行程序,我可能会发现我不能写文件,但我确实可以。

    剩下的唯一选项是使用open():

    int fd = open(file, O_RDWR);
    if (fd == -1) {
        fd = open(file, O_RDONLY);
    }
    if (fd == -1) {
        perror("open");
    }