Perl的文件测试运算符的C等价物是多少?

时间:2015-01-26 17:17:26

标签: c file-io access-control

Perl有一个文件测试运算符列表,用于检查文件对进程的有效用户(http://perldoc.perl.org/functions/-X.html)是否可读-r,可写-w或可执行-x。我怎么用C做这个?

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

我知道libc有一个名为access()的函数,但这适用于该进程的真实用户,仅对setuid程序有用。

2 个答案:

答案 0 :(得分:3)

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

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

我不知道任何&#34;标准&#34; C函数执行相同的可写性测试,而不是实际尝试打开文件并检查文件是否可写时产生的错误。

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

答案 1 :(得分:0)

我无法使用stat(),因为尝试模仿文件访问过于复杂,永远无法移植。

我无法使用access(),因为如果我在sudo下运行该程序,我可能会回来说我无法写一个文件,当我绝对可以。

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

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