[리눅스 시스템 프로그래밍] 4.3 chmod, fchmod

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

#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

chmod나 fchmod로 파일의 접근 권한을 변경하기 위해서는 선행 조건으로 유효 사용자 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>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char **argv)
{        
    if(argc != 3)
    {
        fprintf(stderr,"usage: %s <file name> <access mode>\n",argv[0]);
        fprintf(stderr,"access mode is octet number. must start ‘O’\n",argv[0]);
        return 1;
    }
    if(access(argv[1],F_OK)!=0)
    {
        printf("%s is not existed\n",argv[1]);
        return 1;
    }

    int mode = 0;
    sscanf(argv[2], “0%o”,&mode);
    if(chmod(argv[1],mode)!=0)
    {
        printf("fail change mode\n");
    }
    else
    {
        printf("success change mode\n");
    }
    return 0;    
}
[그림 4.4] ex_chmod 실행 화면
[그림 4.4] ex_chmod 실행 화면