Linux系统调用:access() - 检查文件执行权限函数

 函数原型

#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

 参考

linux中的access函数

Linux系统调用--access函数详解

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值