位置:首页 > 其他技术 > Unix/Linux系统调用 > access()函数 Unix/Linux

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

请另参阅