access函數使用


調用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,判斷對文件是否有讀寫權限
對於后三種情況,可以用“或”的方法將多種情況合在一起測試,比如R_OK | W_OK就代表測試進程對文件的讀寫權限。
 

對於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; 
}  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM