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程序有用。
答案 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");
}