프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍

chmod, fchmod 시스템 호출로 파일의 접근 권한 변경

언제나휴일 2016. 10. 31. 12:48
반응형

4.3 chmod, fchmod

 이번에는 존재하는 파일에 접근 권한을 변경하는 chmodfchmod 함수를 살펴봅시다.

#include <sys/types.h>

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);

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

int fchmod(int fd, mode_t mode);

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

 

 chmodfchmod로 파일의 접근 권한을 변경하기 위해서는 선행 조건으로 유효 사용자 ID가 파일의 쇼유자이거나 루트의 권한을 갖고 있어야 합니다.

 

 두 개의 함수 모두 두 번째 입력 매개 변수는 설정할 모드로 다음처럼 매크로 상수로 정의하고 있습니다.

S_IRUSR: 사용자 읽기 권한

S_IWUSR: 사용자 쓰기 권한

S_IXUSR: 사용자 실행 권한

S_IRXWU: 사용자 읽기, 쓰기, 실행 권한

 

S_IRGRP: 그룹 읽기 권한

S_IWGRP: 그룹 쓰기 권한

S_IXGRP: 그룹 실행 권한

S_IRWXG: 그룹 읽기, 쓰기, 실행 권한

 

S_IROTH: 나머지 읽기 권한

S_IWOTH: 나머지 쓰기 권한

S_IXOTH: 나머지 실행 권한

S_IRWXO: 나머지 읽기, 쓰기, 실행 권한

 

S_ISUID set user id

S_ISGID set group id

S_ISVTX saved sticky bit

 

mode는 매크로 상수를 사용할 수도 있지만 8진수 세 자리로 간단히 권한을 부여할 수 있습니다. 8진수는 맨 앞 자리는 사용자, 두 번째는 그룹, 세 번째는 나머지를 의미하며 4는 읽기, 2는 쓰기 1은 실행 권한을 의미합니다. 따라서 0664는 사용자과 그룹은 읽기, 쓰기를 나머지에는 읽기 권한을 의미합니다.

 

다음은 파일의 권한을 변경하는 예제 코드입니다.

/***********************************************************************

* ex_chmod.c                                                                      *

* example source - change file access mode                             *

***********************************************************************/

#include <stdio.h>

#include <unistd.h>

int main(int argc,char **argv)

{       

    if(argc != 3)

    {

        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(chmod(argv[1],atoi(argv[2]))!=0)

    {

        printf("fail change mode\n");

    }

    else

    {

        printf("success change mode\n");

    }

    return 0;   

}

10진수 4388진수로 0664입니다.

chmod 시스템 호출로 파일 접근 권한 확인

[그림 4.4] ex_chmod 실행 화면


반응형