在linux系统的c语言编程中,access函数是用于检查进程对指定文件的访问权限以及文件是否存在的标准库函数,它定义在unistd.h头文件中,是文件操作相关开发中常用的工具函数。

access函数的基本定义
access函数的函数原型如下:
#include <unistd.h> int access(const char *pathname, int mode);
其中pathname是需要检查的文件路径,可以是绝对路径也可以是相对路径;mode是检查的权限模式,由多个权限宏通过按位或组合而成。
参数mode的可选值
mode参数支持以下几种常见的权限宏,这些宏同样定义在unistd.h头文件中:
- F_OK:检查文件是否存在,不检查权限
- R_OK:检查文件是否具备读权限
- W_OK:检查文件是否具备写权限
- X_OK:检查文件是否具备执行权限
如果需要同时检查多种权限,可以将对应的宏用按位或运算符组合,例如检查文件是否存在且可读可写,可以使用F_OK | R_OK | W_OK作为mode参数。
返回值说明
access函数的返回值规则如下:
- 如果检查的所有条件都满足,返回0
- 如果检查的条件不满足,或者发生其他错误,返回-1,同时会设置errno全局变量来标识具体的错误原因
常见的errno值包括ENOENT表示文件不存在,EACCES表示权限不足,EFAULT表示pathname指针指向的地址非法等。
使用示例
示例1:检查文件是否存在
下面的代码演示如何使用access函数判断指定路径的文件是否存在:
#include <stdio.h>
#include <unistd.h>
int main() {
const char *file_path = "./test.txt";
// 检查文件是否存在
if (access(file_path, F_OK) == 0) {
printf("文件 %s 存在n", file_path);
} else {
printf("文件 %s 不存在n", file_path);
}
return 0;
}
示例2:检查文件是否具备读写权限
下面的代码检查指定文件是否存在,并且是否同时具备读和写权限:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
const char *file_path = "./data.conf";
// 检查文件存在且可读可写
if (access(file_path, F_OK | R_OK | W_OK) == 0) {
printf("文件 %s 存在,且具备读写权限n", file_path);
} else {
if (errno == ENOENT) {
printf("文件 %s 不存在n", file_path);
} else if (errno == EACCES) {
printf("文件 %s 权限不足,无法读写n", file_path);
} else {
printf("检查文件 %s 时发生其他错误n", file_path);
}
}
return 0;
}
示例3:检查可执行文件权限
下面的代码判断指定路径的文件是否为可执行文件:
#include <stdio.h>
#include <unistd.h>
int main() {
const char *exe_path = "./app";
if (access(exe_path, X_OK) == 0) {
printf("%s 具备执行权限n", exe_path);
} else {
printf("%s 不具备执行权限n", exe_path);
}
return 0;
}
使用注意事项
- access函数检查的是进程的实际用户ID和实际组ID对应的权限,而不是有效用户ID和有效组ID,这一点和open等函数不同,在多用户或者设置了setuid的程序中需要特别注意
- access函数存在竞态条件问题,比如检查文件存在后,在打开文件之前文件可能被删除或者权限被修改,因此在需要安全操作的场景中,建议先尝试直接执行对应操作,再根据错误码处理,而不是先检查再操作
- 如果pathname是符号链接,access函数会检查符号链接指向的目标文件的权限,而不是符号链接本身的权限
- 当mode参数同时包含F_OK和其他权限宏时,只要文件不存在就会直接返回-1,不会继续检查权限
注意:在使用access函数时,一定要包含unistd.h头文件,否则编译器可能会报函数隐式声明的警告,甚至导致编译错误。
access函数linux_c文件权限检查unistd_h文件存在性判断修改时间:2026-06-27 04:54:24