access()
函数用于检查调用进程对指定文件的访问权限。它是 Unix/Linux 系统中一个非常有用的系统调用。
#include <unistd.h>
int access(const char *pathname, int mode);
F_OK
: 测试文件是否存在R_OK
: 测试读权限W_OK
: 测试写权限X_OK
: 测试执行权限#include <unistd.h>
#include <stdio.h>
int main() {
if (access("test.txt", F_OK) == 0) {
printf("文件存在\n");
} else {
perror("文件不存在或无权限");
}
return 0;
}
#include <unistd.h>
#include <stdio.h>
int main() {
const char *filename = "data.txt";
if (access(filename, R_OK) == 0) {
printf("文件可读\n");
} else {
perror("文件不可读");
}
if (access(filename, W_OK) == 0) {
printf("文件可写\n");
} else {
perror("文件不可写");
}
return 0;
}
#include <unistd.h>
#include <stdio.h>
int main() {
const char *filename = "script.sh";
if (access(filename, F_OK | R_OK | X_OK) == 0) {
printf("文件存在且可读可执行\n");
} else {
perror("权限检查失败");
}
return 0;
}
access()
检查的是实际用户(real UID/GID)的权限,而不是有效用户(effective UID/GID)的权限access()
会解引用链接检查目标文件的权限access()
要小心竞态条件(TOCTTOU问题)对于更安全的文件操作,可以考虑:
- faccessat()
(更现代的替代方案)
- 直接尝试打开文件并检查返回值
希望这个指南对你有帮助!如果你有关于 access()
函数的更具体问题,可以继续提问。