access() - ファイルにアクセスできるかどうかの判別

標準

標準/拡張機能 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 '/'

関連情報