Linux access()函式 使用

2puT發表於2016-07-11
Linux access函式功能描述: 檢查呼叫程式是否可以對指定的檔案執行某種操作。
Linux access函式用法: 


#include 
#include 
int access(const char *pathname, int mode);
Linux access函式引數: 
pathname: 需要測試的檔案路徑名。 
mode: 需要測試的操作模式,可能值是一個或多個R_OK(可讀?), W_OK(可寫?), X_OK(可執行?) 或 F_OK(檔案存在?)組合體。
Linux access函式返回說明: 
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值 
EINVAL: 模式值無效 
EACCES: 檔案或路徑名中包含的目錄不可訪問 
ELOOP : 解釋路徑名過程中存在太多的符號連線 
ENAMETOOLONG:路徑名太長 
ENOENT:路徑名中的目錄不存在或是無效的符號連線 
ENOTDIR: 路徑名中當作目錄的元件並非目錄 
EROFS: 檔案系統只讀 
EFAULT: 路徑名指向可訪問的空間外 
EIO:輸入輸出錯誤 
ENOMEM: 不能獲取足夠的核心記憶體 
ETXTBSY:對程式寫入出錯
Linux access函式例子: 
例子: 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h>
int main(int argc, char *argv[]) 

   if (argc < 2) { 
       printf("Usage: ./test filename\n"); 
       exit(1); 
   } 
   if (access(argv[1], F_OK) == -1) { 
       puts("File not exists!"); 
       exit(2); 
   } 
   if (access(argv[1], R_OK) == -1) 
       puts("You can't read the file!"); 
   else 
       if (access(argv[1], R_OK | W_OK) != -1) 
           puts("You can read and write the file"); 
       else 
           puts("You can read the file"); 
   
   exit(0); 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h>
int main(int argc, char *argv[]) 

   if (argc < 2) { 
       printf("Usage: ./test filename\n"); 
       exit(1); 
   } 
   if (access(argv[1], F_OK) == -1) { 
       puts("File not exists!"); 
       exit(2); 
   } 
   if (access(argv[1], R_OK) == -1) 
       puts("You can't read the file!"); 
   else 
       if (access(argv[1], R_OK | W_OK) != -1) 
           puts("You can read and write the file"); 
       else 
           puts("You can read the file"); 
   
   exit(0); 
}

由於Linux Access函式只作許可權的核查,並不理會檔案形態或檔案內容,因此,如果一目錄表示為“可寫入”,表示可以在該目錄中建立新檔案等操作,而非意味此目錄可以被當做檔案處理。例如,你會發現DOS的檔案都具有“可執行”許可權,但用execve執行時則會失敗。
Linux Access函式(判斷是否具有存取檔案的許可權)
相關函式
stat,open,chmod,chown,setuid,setgid
表標頭檔案
#include<unistd.h>
定義函式
int access;
Linux Access函式說明
access會檢查是否可以讀/寫某一已存在的檔案。引數mode有幾種情況組合, R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK與X_OK用來檢查檔案是否具有讀取、寫入和執行的許可權。F_OK則是用來判斷該檔案是否存在。由於access只作許可權的核查,並不理會檔案形態或檔案內容,因此,如果一目錄表示為“可寫入”,表示可以在該目錄中建立新檔案等操作,而非意味此目錄可以被當做檔案處理。例如,你會發現DOS的檔案都具有“可執行”許可權,但用execve執行時則會失敗。
Linux Access函式返回值
若所有欲查核的許可權都通過了檢查則返回0值,表示成功,只要有一許可權被禁止則返回-1。
錯誤程式碼
EACCESS 引數pathname 所指定的檔案不符合所要求測試的許可權。
EROFS 欲測試寫入許可權的檔案存在於只讀檔案系統內。
EFAULT 引數pathname指標超出可存取記憶體空間。
EINVAL 引數mode 不正確。
ENAMETOOLONG 引數pathname太長。
ENOTDIR 引數pathname為一目錄。
ENOMEM 核心記憶體不足
ELOOP 引數pathname有過多符號連線問題。
EIO I/O 存取錯誤。
Linux Access函式附加說明
使用access作使用者認證方面的判斷要特別小心,例如在access後再做open的空檔案可能會造成系統安全上的問題。
範例
/ 判斷是否允許讀取/etc/passwd /
#include<unistd.h>
int main

執行
/etc/passwd can be read


相關文章