[리눅스 시스템 프로그래밍] 4.2 access

리눅스 시스템에서는 사용자 계정에 따라 파일 접근 권한을 다르게 부여할 수 있습니다. 그리고 사용자 계정은 크게 사용자 ID와 그룹 ID가 있습니다.

사용자 ID는 로긴한 ID를 의미하는 실제 사용자 ID(Real User ID)와 프로세스 실행 상태에서 권한 기준인 유효 사용자 ID(Effective User ID)가 있습니다. 일반적으로 실제 사용자 ID는 유효 사용자 ID와 같지만 프로그램에 saved set user id가 있을 때 유효 사용자 ID는 실제 사용자 ID와 다를 수 있습니다.

그룹 ID도 실제 로긴한 사용자의 그룹 ID와 보조 그룹 ID들과 프로세스 실행 상태에서 권한 기준인 유효 그룹 ID가 있습니다. 마찬가지로 실제 그룹 ID와 유효 그룹 ID는 일반적으로 같지만 saved set group id가 있을 때 유효 그룹 ID는 실제 그룹 ID와 다를 수 있습니다.

사용자 ID와 그룹 ID에 관한 사항은 계정 설정에 관한 시스템 호출을 다룰 때 자세히 소개하기로 할게요.

리눅스 시스템에서는 파일에 접근할 때 사용자 계정이나 그룹에 따라 접근 권한이 다르게 부여할 수 있습니다. 그리고 access 함수로 파일에 읽기, 쓰기, 실행 권한과 존재하는지 확인할 수 있습니다.

#include <unistd.h >

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

반환 값: 실패 시 -1, 성공 시 0

access 함수의 두 번째 입력 매개 변수에는 확인하고자 하는 모드를 전달할 수 있으며 다음의 네 개의 매크로 상수를 정의하고 있습니다.

R_OK: 읽기 권한 확인

W_OK: 쓰기 권한 확인

X_OK: 실행 권한 확인

F_OK: 파일 존재 여부 확인

다음은 특정 파일에 권한이 있는지 확인하는 예제 코드입니다.

/***********************************************************************
* ex_access.c                                                          *
* example source - about file access                                   *
***********************************************************************/
#include <stdio.h>
#include <unistd.h>

int main(int argc,char **argv)
{        
    if(argc != 2)
    {
        fprintf(stderr,"usage: %s <file name>\n",argv[0]);
        return 1;
    }

    if(access(argv[1],F_OK)!=0)
    {
        printf("%s is not existed\n",argv[1]);
        return 1;
    }
    if(access(argv[1],R_OK)==0)
    {
        printf("can read\n");
    }
    else
    {
        printf("can't read\n");
    }
    if(access(argv[1],W_OK)==0)
    {
        printf("can write\n");
    }
    else
    {
        printf("can't write\n");
    }

    if(access(argv[1],X_OK)==0)
    {
        printf("can execute\n");
    }
    else
    {
        printf("can't execute\n");
    }
    return 0;    
}
[그림 4.3] ex_access 실행 화면
[그림 4.3] ex_access 실행 화면