C & LINUX

C / LINUX access()

Ocean_ 2022. 5. 2. 14:44

함수 기능

인자로 지정한 파일에 대해 사용자 , 프로세스 접근가능한지 판단하는 시스템호출

함수 원형

#include<unistd.h>
int access(const char *pathname, int mode)

리턴값 : 성공시 0 에러시 -1 리턴

함수 파라메터

pathname

인자로 지정한 파일

mode

R_OK, W_OK, X_OK, F_OK

파일존재여부판정

 

함수 예제

access1

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

int main(int argc, char *argv[]){

    int i;

    if(argc<2){
        fprintf(stderr,"usage:%s<file1><file2>..<fileN>\n",argv[0]);
        exit(1);
    }

    for(i=1; i<argc; i++){
        if(access(argv[i],F_OK)<0){
            fprintf(stderr,"%s doesn't exist.\n",argv[i]);
            continue;
        }

        if(access(argv[i],R_OK)==0)
            printf("User can read %s\n",argv[i]);

        if(access(argv[i],W_OK)==0)
            printf("User can write %s\n",argv[i]);
        
        if(access(argv[i],X_OK)==0)
            printf("User can execute %s\n",argv[i]);

    }
    exit(0);
}

access2

#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}
    };

    int i;
    if(argc<2){
        fprintf(stderr,"usage : %s<file>\n",argv[0]);
        exit(1);
    }
    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);
}

함수 결과

access1

access2

리눅스시스템 프로그래밍 - 홍지만 저

교재 내에 있는 예제를 바탕으로 작성한 글 입니다.