函数原型
#include <unistd.h>
int access(const char *pathname, int mode);
参数说明:
pathname:是文件的路径名+文件名,指定要测试的文件。文件的路径名可以是绝对路径也可以是相对路径。
mode:指明测试哪种权限,有下面4种权限:
- F_OK 值为0,判断文件是否存在
- R_OK 值为4,判断对文件是否有读权限
- W_OK 值为2,判断对文件是否有写权限
- X_OK 值为1,判断对文件是否有可执行权限
返回值:当判断具有权限时,返回0;否则返回-1,并且errno被设置为以下的某个值:
EINVAL: 模式值无效
EACCES: 文件或路径名中包含的目录不可访问
ELOOP : 解释路径名过程中存在太多的符号连接
ENAMETOOLONG:路径名太长
ENOENT: 路径名中的目录不存在或是无效的符号连接
ENOTDIR: 路径名中当作目录的组件并非目录
EROFS: 文件系统只读
EFAULT: 路径名指向可访问的空间外
EIO: 输入输出错误
ENOMEM: 不能获取足够的内核内存
ETXTBSY:对程序写入出错
示例程序
/*
*程序描述:使用access()函数对指定文件进行文件权限的检查操作。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
int file_check(char *dir, char *filename)
{
char full_filename[512]={0};
snprintf(full_filename, 512, "%s/%s", dir, filename);
printf("full_filename = %s\n", full_filename);
if(access(full_filename, F_OK)){
printf("check error: %s\n", strerror(errno));
return -1;
}
if(access(full_filename, R_OK)){
printf("check error: %s\n", strerror(errno));
return -2;
}
if(access(full_filename, W_OK)){
printf("check error: %s\n", strerror(errno));
return -3;
}
/*if(access(full_filename, X_OK)){
printf("check error: %s\n", strerror(errno));
return -4;
}*/
return 0;
}
int main(int argc, char *argv[])
{
char dir[256]={0};
char filename[256]={0};
if(argc < 3){
printf("Usage: ./<exec_file> <dir> <filename>\n");
return -1;
}
strncpy(dir, argv[1], sizeof(dir));
strncpy(filename, argv[2], sizeof(filename));
int status = file_check(dir, filename);
if(!status){
printf("file check success.\n");
}else{
printf("file check error! status=%d\n", status);
}
return 0;
}
编译命令:gcc access_demo.c -o access -std=c99
运行结果1:./access ../glib_work glib_version.c
full_filename = ../glib_work/glib_version.c
file check success.
运行结果2:./access ../glib_work glib_versio
full_filename = ../glib_work/glib_versio
check error: No such file or directory
file check error! status=-1
参考