調用open函數時,是以有效用戶而不是實際用戶的身份去驗證進程對要打開的文件的讀寫權限。但是有時候我們想知道的是實際用戶而非有效用戶對某一文件的權限,此時就要用到access函數。
函數原型:
int access(const char* pathname, int mode);
int faccessat(int fd, const char* pathname, int mode, int flag);
所需庫:#include<unistd.h>
返回值:如果文件具有指定的訪問權限,則函數返回0;如果文件不存在或者不能訪問指定的權限,則返回-1。
先說簡單的access函數,pathname是文件的路徑名+文件名,指定要測試的文件;mode則指明測試哪種權限,實際上有4種:
- F_OK 值為0,判斷文件是否存在
- R_OK 值為4,判斷對文件是否有讀權限
- W_OK 值為2,判斷對文件是否有寫權限
- X_OK 值為1,判斷對文件是否有讀寫權限
對於faccessat函數,其用fd來指定目錄,mode的含義不變,而flag可以指定是判斷有效用戶的權限還是實際用戶的權限。
如果flag的值是AF_EACCESS(值為0x200)的話,判斷的是有效用戶的權限;
如果flag的值是0的話,則跟access一樣,判斷的是實際用戶的權限。
當判斷有權限時,返回0,否則返回-1.
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> void err_sys(char *); void err_sys(char *err_txt) { printf("%s\n",err_txt); exit(1); } int main(int argc, char* argv[]) { // access 以實際用戶ID測試進程的訪問權限 printf("euid = %d,egid = %d,uid = %d, gid = %d\n",geteuid(), getegid(), getuid(), getgid()); if (argc != 2) err_sys("you should input: %s file_name\n",argv[0]); //判斷實際用戶的權限 if(access(argv[1], R_OK | W_OK) < 0) printf("access error for RW!\n"); else printf("access OK for RW!\n"); //以有效用戶身份打開文件 if(open(argv[1], O_RDWR) < 0) printf("open error for RW"); else printf("open ok for RW"); return 0; }