標準
標準/拡張機能 |
C/C++ |
依存項目 |
ISO C
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3
|
両方 |
|
形式
#define _POSIX_SOURCE
#include <unistd.h>
int access(const char *pathname, int how);
機能説明
HFS ファイルにアクセスする方法を判断します。プロセスに適切な許可があるかどうかを調べるときに、access() は
有効な ID ではなく、実 ユーザー ID (UID) と
グループ ID (GID) を調べます。
pathname は、そのアクセス可能性をテストするファイルの名前です。
how 引数は、テストするアクセス・モードを示します。以下のシンボルは、
how 引数で使用するため、unistd.h ヘッダー・ファイルで定義します。
- F_OK
- ファイルが存在するかどうかをテストする。
- R_OK
- 読み取るためにファイルにアクセスできるかどうかを
テストする。
- W_OK
- 書き込むためにファイルにアクセスできるかどうかを
テストする。
- X_OK
- 実行するためにファイルにアクセスできるかどうかを
テストする。
いくつかのアクセス・モードを同時にテストするために、最後の 3 つのシンボルのいずれかまたはすべてに対して、ビット単位の包含 OR を取ることができます。ファイルが存在するかどうかをテストするのに F_OK を使用している場合、その他のシンボルのいずれかで OR を使用することはできません。
戻り値
指定のアクセスが許可された場合、access() は、0 を戻します。
指定の方法で該当ファイルにアクセスできない場合、access() は -1 を戻して、errno を、次のいずれかの値に設定します。
- エラー・コード
- 説明
- EACCES
- プロセスには、指定の方法でファイルにアクセスする
適切な許可がありません。または、このプロセス
に、pathname 接頭部の一部コンポーネントに関する
検索許可がありません。
- EINVAL
- how の値は正しくありません。
- ELOOP
- シンボリック・リンクにループが存在しています。
- ENAMETOOLONG
- pathname が PATH_MAX 文字よりも長い。 PATH_MAX 値は、pathconf() を使用して判別します。
- ENOENT
- pathname という名前のファイルがないか、あるいは pathname 引数が空ストリングです。
- ENOTDIR
- pathname 接頭部のコンポーネントの一部がディレクトリーではありません。
- EROFS
- how 引数が、読み取り専用ファイル・システムの
ファイルに対して書き込みアクセスを指定しました。
POSIX C の場合の戻り値
プログラムが POSIX(ON) で実行中のときに、以下の errno 値は異なる動作をします。
- エラー・コード
- 説明
- ELOOP
- シンボリック・リンクにループが存在しています。解決で検出されたシンボリック・リンクの数
が、POSIX_SYMLOOP (limits.h ヘッダー・ファイルで
定義された値) よりも大きい場合は、このエラーが発行されます。
- ENAMETOOLONG
- _POSIX_NO_TRUNC (unistd.h ヘッダー・ファイルに定義されている)
が有効なときに、pathname の長さが PATH_MAX 文字よりも長い、または pathname の一部のコンポーネントが NAME_MAX よりも長くなっています。PATH_MAX および NAME_MAX の値は、pathconf() を使用して判別されます。
例
CELEBA03 ⁄* CELEBA03
The following example determines how a file is accessed.
*⁄
#define _POSIX_SOURCE
#include <stdio.h>
#undef _POSIX_SOURCE
#include <unistd.h>
main() {
char path[]="⁄";
if (access(path, F_OK) != 0)
printf("'%s' does not exist!¥n", path);
else {
if (access(path, R_OK) == 0)
printf("You have read access to '%s'¥n", path);
if (access(path, W_OK) == 0)
printf("You have write access to '%s'¥n", path);
if (access(path, X_OK) == 0)
printf("You have search access to '%s'¥n", path);
}
}
出力: 非スーパーユーザーより:
You have read access to '/'
You have search access to '/'