访问, accessx , facessx , accessxat 或 facessat 子例程
用途
确定文件的可访问性。
库
标准 C 库 (libc.a)
语法
#include <unistd.h> char *PathName;
int Mode;
int accessx (PathName, Mode, Who)
char *PathName;
int Mode, Who;
int faccessx (FileDescriptor, Mode, Who)
int FileDescriptor;
int Mode, Who;
int accessxat (DirFileDescriptor, PathName, Mode, Who)
int DirFileDescriptor;
char *PathName;
int Mode, Who;
int faccessat (DirFileDescriptor, PathName, Mode, Flag)
int DirFileDescriptor;
char *PathName;
int Mode, Flag;
描述
access, accessx, accessxat, facessat 和 facessx 子例程确定文件系统对象的辅助功能选项。 accessx, accessxat和 facessx 子例程允许指定要检查其访问权的用户或进程的类。
调用者必须具有 PathName 参数的所有组件的搜索许可权。
The accessxat subroutine is equivalent to the 访问x subroutine, and the 咨询 subroutine is equivalent to the 访问 subroutine if the PathName parameter specifies an absolute path or if the DirFileDescriptor parameter is set to AT_FDCWD. 文件的可访问性由与DirFileDescriptor参数关联的目录的相对路径决定,而不是由当前工作目录决定。 如果在不使用 O_SEARCH 打开标志的情况下访问目录,那么子例程将检查以确定是否允许使用目录的当前许可权进行目录搜索。 如果使用 O_SEARCH 打开标志访问目录,那么子例程不会执行检查。
参数
| 项 | 描述 |
|---|---|
| PathName | 指定文件的路径名。 如果 PathName 参数引用符号链接,那么 access 子例程返回有关符号链接指向的文件的信息。 如果指定了DirFileDescriptor且PathName是相对的,则DirFileDescriptor会指定PathName 的有效当前工作目录。 |
| FileDescriptor | 指定打开文件的文件描述符。 |
| 方式 | 指定要检查的访问方式。 此参数是包含 0 或更多以下值的位掩码,这些值在 <sys/access.h> 文件中定义:
如果未指定任何这些值,那么将检查文件是否存在。 |
| 谁 | 指定要检查其访问权的用户的类。 此参数必须是 <sys/access.h> 文件中定义的下列其中一个值:
|
| DirFileDescriptor | 指定开放式目录的文件描述符,该文件描述符用作 PathName 参数的有效当前工作目录。 如果 "DirFileDescriptor参数等于 "AT_FDCWD,"DirFileDescriptor参数将被忽略,而 "PathName参数将指定完整的文件。 |
| 标志 | 指定位字段参数。 如果 Flag 参数等于 AT_EACCESS,那么将检查有效用户和组标识 (ACC_SELF)。 如果 Flag 参数为零,那么将检查实际标识 (ACC_INVOKER)。 |
返回值
如果允许请求的访问权,那么 access, accessx, faccessx, accessxat, 而 facessat 子例程返回值 0。 如果请求的访问不允许或函数调用失败,则返回值为-1,并设置errno全局变量来指示错误。
access 子例程指示 X_OK 成功,即使未设置任何执行文件许可权位也是如此。
错误代码
如果以下一项或多项为 true ,那么 访问 facessat, accessx和 accessx 子例程将失败:
| 项 | 描述 |
|---|---|
| EACCES | 对 PathName 前缀的组件的搜索许可权被拒绝。 |
| Efault | PathName 参数指向进程的已分配地址空间之外的位置。 |
| ELOOP | 转换 PathName 参数时迂到太多符号链接。 |
| ENAMETOOLONG | PathName 参数的组件超过 255 个字符,或者整个 PathName 参数超过 1022 个字符。 |
| ENOENT | PathName 的组件不存在,或者进程设置了 disallow truncation 属性。 |
| ENOENT | 指定的文件不存在。 |
| ENOENT | PathName 参数为空。 |
| ENOENT | 指定了符号链接,但它所引用的文件不存在。 |
| ENOTDIR | PathName 的组件不是目录。 |
| ESTALE | 进程根目录或当前目录位于已卸载的虚拟文件系统中。 |
如果以下情况成立,那么 faccessx 子例程将失败:
| 项 | 描述 |
|---|---|
| EBADF | FileDescriptor 参数的值无效。 |
如果下列其中一项或多项为 true ,那么 access, accessx和 facessx 子例程将失败:
| 项 | 描述 |
|---|---|
| EACCES | 文件保护不允许所请求的访问权。 |
| ENOMEM | 无法分配内存。 |
| EIO | 操作期间发生 I/O 错误。 |
| EROFS | 请求对只读文件系统上的文件进行写访问。 |
如果以下一个或多个设置为 true ,那么 accessxat 和 faccessat 子例程将失败:
| 项 | 描述 |
|---|---|
| EBADF | PathName参数没有指定绝对路径,而DirFileDescriptor参数既不是 AT_FDCWD,也不是有效的文件描述符。 |
| EINVAL | Flag 参数的值无效。 |
| ENOTDIR | PathName参数不是绝对路径,而DirFileDescriptor是文件描述符,但与目录无关。 |
如果在系统上安装了网络文件系统 (NFS) ,那么如果满足以下设置,那么 accessx, accessxat和 facessx 子例程也可能失败:
| 项 | 描述 |
|---|---|
| ETIMEDOUT | 连接超时。 |
| ETXTBSY | 请求对正在执行的共享文本文件进行写访问。 |
| EINVAL | Mode 自变量的值无效。 |