C,C++ & Linux

C/C++ access(2)

KyooDong 2020. 5. 17. 19:55
728x90

access(2) 함수 기능

프로세스가 지정한 파일에 대해 접근 가능한지 확인해주는 함수

프로세스가 접근 가능 여부는 유효 사용자 아이디와 유효 사용자 그룹 아이디에 의해 결정됩니다.

함수 원형

#include <unistd.h>

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

매개변수

filepath

권한을 확인하고자 하는 파일의 경로

 

mode

어떤 권한을 확인하고 싶은지 명시하는 모드

모드 설명
F_OK 파일의 존재 유무
R_OK 읽기 권한 판정
W_OK 쓰기 권한 판정
X_OK 실행 권한 판정

반환값

성공 시 0 리턴 (권한이 있으면 0 리턴)

에러 시 -1 리턴하고 errno 설정

예제

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

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (access(argv[i], F_OK) < 0) {
            fprintf(stderr, "%s 파일이 존재하지 않습니다.\n", argv[i]);
            continue;
        }
        printf("%s 권한 : ", argv[i]);

        if (access(argv[i], R_OK) == 0)
            printf(" 읽기권한");

        if (access(argv[i], W_OK) == 0)
            printf(" 쓰기권한");

        if (access(argv[i], X_OK) == 0)
            printf("실행권한");

        printf("\n");
    }
    exit(0);
}

결과

예제2

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

#define TABLE_SIZE (sizeof(table)/sizeof(*table))

int main(int argc, char *argv[]) {
    struct {
        char *text;
        int mode;
    } table[] = {
        {"exists", 0},
        {"execute", 1},
        {"write", 2},
        {"read", 4}
    };

	// i == 0 : exists
	// i == 1 : execute
	// i == 2 : write
	// i == 3 : read
    for (int i = 0; i < TABLE_SIZE; i++) {
        if (access(argv[1], table[i].mode) != -1)
            printf("%s -ok\n", table[i].text);
        else
            printf("%s\n", table[i].text);
    }
    exit(0);
}

결과

 

 

 

 

 

 

 

 

 

 

리눅스시스템프로그래밍 저자 : 홍지만
https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)