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

請另參閱