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