access()函數 Unix/Linux
名稱
access - 檢查用戶的權限的文件
內容簡介
#include <unistd.h>
int access(const char **pathname*, int mode**);**
描述
access()檢查該進程是否將被允許讀,寫或測試存在的文件(或其他文件系統對象),其名稱是路徑名。如果 pathname 的符號鏈接文件權限這個符號鏈接所提到的測試.
mode 是一種包括一個或多個掩碼 R_OK, W_OK, X_OK 和 F_OK.
R_OK, W_OK 和 X_OK 檢查文件是否存在並具有讀,寫和執行權限,分別要求。 F_OK 只是要求檢查存在的文件。
測試依賴於權限的目錄中出現的文件路徑 pathname ,並在途中遇到的符號鏈接的目錄和文件的權限。
檢查進程的真實的UID和GID,而不是ID作爲實際嘗試操作時的有效完成。這是爲了讓設置用戶ID程序可以輕鬆地確定調用用戶的權限。
只有訪問位被選中,而不是文件類型或內容。因此,如果一個目錄被發現是「可寫,」它可能意味着文件可以在目錄中創建,而不是作爲一個文件可以寫入該目錄。同樣,一個DOS文件可能被發現是「可執行文件」,但仍然會失敗調用execve(2)調用。
如果過程中有適當的權限,執行可能表明,即使沒有任何執行文件的權限位被設置爲X_OK成功。
返回值
成功(所有請求的權限),則返回0。錯誤(至少一個位模式要求被拒絕的權限,或發生其他一些錯誤),則返回-1,errno設置爲合適。
錯誤
access() 可能會失敗,如果:
標籤
描述
EACCES
The requested access would be denied to the file or search permission is denied for one of the directories in the path prefix of pathname. (See also path_resolution(2).)
ELOOP
Too many symbolic links were encountered in resolvingpathname.
ENAMETOOLONG
pathname is too long.
ENOENT
A directory component in pathname would have been accessible but does not exist or was a dangling symbolic link.
ENOTDIR
A component used as a directory in pathname is not, in fact, a directory.
EROFS
Write permission was requested for a file on a read-only filesystem.
access() 可能會失敗,如果:
標籤
描述
EFAULT
pathname points outside your accessible address space.
EINVAL
mode was incorrectly specified.
EIO
An I/O error occurred.
ENOMEM
Insufficient kernel memory was available.
ETXTBSY
Write access was requested to an executable which is being executed.
限制
access() 返回一個錯誤,如果沒有在所請求的調用失敗的訪問類型,即使其他類型可能會成功。
access() 可能無法正常工作與UID映射NFS文件系統上啓用UID映射,因爲在服務器上完成,並從客戶端隱藏,檢查權限。
使用 access() 來檢查用戶是否被授權,例如打開一個文件之前,其實這樣使用 open(2)創建一個安全漏洞,因爲用戶可能會利用檢查並打開文件操作的間隔時間短。
C遵循於
SVr4, POSIX.1-2001, 4.3BSD
請另參閱
chmod (2)
chown (2)
faccessat (2)
open (2)
path_resolution (2)
setgid (2)
setuid (2)
stat (2)