ACCESS(2)

名称
access, eaccess - ファイルのアクセス可能性をチェックする

ライブラリ
libc

書式
<unistd.h> int access(const char *path, int mode) int eaccess(const char *path, int mode)

解説
access() システムコールと eaccess() システムコールは、 mode 引数によって示されたアクセス許可について path 引数で指定されるファイルのアクセス可能性をチェックします。 mode の値は、チェックされるアクセス許可 (読取り許可については R_OK 、書込み許可については W_OK 、実行 / 検索許可については X_OK) のビット単位の OR、または存在試験 ( F_OK ) のどちらかです。

さらなる情報は、 intro(2) の ファイルアクセスパーミッション セクションを参照してください。

eaccess() システムコールは、実効ユーザ ID とグループアクセスリストを用いて 要求を許可します。 一方 access() システムコールは、実効ユーザ ID の代わりに実ユーザ ID を、 実効グループ ID の代わりに実グループと残りのグループアクセスリストを 用います。

プロセスの実ユーザもしくは実効ユーザに適切な特権があり、 X_OK について成功を示していても、実際にはファイルの実行許可ビットが 設定されていないことがあります。 同じことが、 R_OK および W_OK にも該当します。

戻り値

エラー
ファイルへのアクセスは次の場合に拒絶されます:

[ENOTDIR]
    パスの構成要素中にディレクトリ以外のものが含まれています。

[ENAMETOOLONG]
    パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。

[ENOENT]
    指定されたファイルが存在しません。

[ELOOP]
    パス名を変換するときに検出されたシンボリックリンクが多すぎます。

[EROFS]
    読取り専用ファイルシステム上のファイルについて書込みアクセスが 要求されました。

[ETXTBSY]
    現時点で実行中の純粋な手続き (共有テキスト) ファイルについて書込みアクセスが要求されています。

[EACCES]
    ファイルモードの許可ビットが要求されたアクセスを許容しないか、 またはパスの構成要素について検索許可が拒絶されています。

[EFAULT]
    path 引数が、プロセスに割り当てられたアドレス空間の範囲外を指しています。

[EIO]
    ファイルシステムに読み書きしている間に入出力エラーが発生しました。

セキュリティに関する考察
access() システムコールは、競合状態によって潜在的なセキュリティホールとなるので、 使うべきではありません。 ユーザ ID 設定とグループ ID 設定されたアプリケーションは、 実効ユーザ ID もしくは実効グループ ID を復元するようにしてください。 そして実ユーザ ID もしくは実グループ ID でのアクセスを、 access() を使用して模擬的にチェックするのではなく、直接実行するべきです。 不適切に使用された場合、 eaccess() 呼び出しも同様にして競合の対象となることがあります。

関連項目
chmod(2), intro(2), stat(2)

規格
access() システムコールは p1003.1-90 に適合しています。

歴史
access() 関数は AT&T UNIX で登場しました。