Perl 的文件测试运算符的 C 等价物是什么?

What is the C equivalent of Perl's file test operators?

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 程序有用。

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

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

我不知道有任何 "standard" C 函数可以执行相同的可写性测试,除了实际尝试打开文件并检查文件不可写时产生的错误。

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

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

我不能使用 access() 因为如果我 运行 sudo 下的程序,我可能会回来说我不能写文件,而我绝对可以。

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

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