이름
access - 파일의 사용자 권한을 체크한다.
사용법
#include <unistd.h>
int access(const char *pathname, int mode);
설명
access 는 프로세스가 파일에 읽고,쓰고 것이 가능한지 체크한다.
만일 경로명이 심볼릭링크라면 링크 테스트로 원본 파일을체크하게 된다.
mode 는 하나이상의 R_OK , W_OK , X_OK and F_OK로 구성된 허상(mask) 이다.
R_OK, W_OK and X_OK 는 각각 파일의 존재, 읽기, 쓰기, 실행권한 체크를 요구한다.
F_OK는단지 파일의 존재유무의 체크만을 요구한다.
테스트는 파일이 위치하고 있는 디렉토리의 권한에 의존하고,
디렉토리와 심볼릭 링크 파일도 같은 이치이다.
커널에의해 실행될때의 id보다는 프로세스의 실제 UID나 GID를 체크하게 된다.
이것은 set-UID프로그램실행을 허락하기 위함이다.
파일 타입이나 내용이 아닌 억세스 비트(access bits)만을 체트한다.
그러므로, 만일 디렉토리가 "쓰기 가능"이라면, 디렉토리안에 파일을 생성할 수 있지만,
디렉토리가 파일로써 쓰여질수 있는것은 아니다.
반환값
모든 요구하는 권한이 받아들여져 성공하게 되면, 0이 반환된다.
적어도 하나 이상이 거절되거나 에러가 나면 -1이 반환되고, errno가 적절하게 셋팅된다.
에러
EACCES 요구한 접근이 파일에 의해 거절되거나 경로명안의 어느 한 디렉토리에 의해 거절되었다.
EROFS 쓰기 권한이 read-only인 파일 시스템에 의해 거절되었다.
EFAULT 경로명의 위치가 당신이 접근할 수 있는 주소공간 밖에 있다.
EINVAL 모드가 적절하지 않다.
ENAMETOOLONG 경로명이 너무길다.
ENOENT 경로명의 디렉토리 구성이 접근 가능하지만 존재하지 않거나 깨진 링크이다.
ENOTDIR 경로명의 디렉토리가 실제 디렉토리가 아니다.
ENOMEM 커널 메모리가 부족하다.
ELOOP 너무많은 심볼릭링크가 경로명안에 존재한다.
EIO I/O 에러.
RESTRICTIONS
access 는 요구한 접근타입(access types)의 호출이 실패하면, 다른 타입이 성공한다하더라도 에러를 반환한다.
access 는 UID 맵핑이 가능한 NFS파일 시스템에서 작동하지 않을 수 있다.
왜냐하면 UID맵핑은 사용자가 볼 수없는 서버에서 실행되기 때문이다.
호환
SVID, AT&T, POSIX, X/OPEN, BSD 4.3
관련 항목
stat(2), open(2), chmod(2), chown(2), setuid(2), setgid(2)