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函數詳解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章