본문 바로가기

os/리눅스

access()

1 사용법
#include 


int access(const char *pathname, int mode);

2 설명
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)만을 체트한다. 그러므로, 만일 디렉토리가 쓰기 가능이라면, 디렉토리안에 파일을 생성할 수 있지만, 디렉토리가 파일로써 쓰여질수 있는것은 아니다. 

3 반환값
모든 요구하는 권한이 받아들여져 성공하게 되면, 0이 반환된다. 적어도 하나 이상이 거절되거나 에러가 나면 -1이 반환되고, errno가 적절하게 셋팅된다. 

4 에러
EACCES :  접근이 파일에 의해 거절되거나 경로명안의 디렉토리에 의해 거절되었다. 
EROFS : 쓰기 권한이 read-only인 파일 시스템에 의해 거절되었다. 
EFAULT : 경로명 의 위치가 당신이 접근할 수 있는 주소공간 밖에 있다. 
EINVAL : 모드 가 적절하지 않다. 
ENAMETOOLONG : 경로명 이 너무길다. 
ENOENT : 경로명의 디렉토리에 접근 가능하지만 존재하지 않거나 깨진 링크이다. 
ENOTDIR :경로명 의 디렉토리가 실제 디렉토리가 아니다. 
ENOMEM : 커널 메모리가 부족하다. 
ELOOP : 너무많은 심볼릭링크가 경로명 안에 존재한다. 
EIO : I/O 에러. 

RESTRICTIONS
access 는 요구한 접근타입(access types)의 호출이 실패하면, 다른 타입이 성공 한다하더라도 에러를 반환한다. 
access 는 UID 맵핑이 가능한 NFS파일 시스템에서 작동하지 않을 수 있다. 왜냐하면 UID맵핑은 사용자가 볼 수없는 서버에서 실행되기 때문이다. 

5 예제


#include <stdio.h>
#include <unistd.h>

int main(){

char *pFile = "./a.c";
if(0 == access(pFile, F_OK){
printf("파일 있음");
if( 0== access(pFile, R_OK | W_OK)
printf("읽거나, 쓰기 가능");

 else 

   printf("읽거나, 쓰기 불가능");

}

}

'os > 리눅스' 카테고리의 다른 글

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'  (0) 2009.11.29
getuid()  (0) 2009.11.02
unlink()  (0) 2009.11.02
Race Condition  (0) 2009.10.31
fork() 함수에 대해서..  (5) 2009.10.30