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");
}
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");
}