이번에는 존재하는 파일에 접근 권한을 변경하는 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; }