ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ chmod(2), fchmod(2)
    C,C++ & Linux 2020. 5. 17. 21:22
    728x90

    chmod 함수 기능

    파일의 접근 권한을 변경하는 함수입니다.

    함수 원형

    #include <sys/types.h>
    #include <sys/stat.h>
    
    int chmod(const char *filepath, mode_t mode);
    int fchmod(int fd, mode_t mode);

    매개변수

    filepath

    대상 파일의 경로

     

    fd

    대상 파일의 파일 디스크립터

     

    mode

    파일의 권한

    테스트 매크로 8진수 내용
    S_ISUID 0004000 set-user-id
    S_ISGID 0002000 set-group-id
    S_ISVTX 0001000 sticky bit
    S_IRWXU 0000700 소유자 권한 마스크
      S_IRUSR 0000400 소유자 읽기 권한
      S_IWUSR 0000200 소유자 쓰기 권한
      S_IXUSR 0000100 소유자 실행 권한
    S_IRWXG 0000070 그룹 권한 마스크
      S_IRGRP 0000040 그룹 읽기 권한
      S_IWGRP 0000020 그룹 쓰기 권한
      S_IXGRP 0000010 그룹 실행 권한
    S_IRWXO 0000007 기타 사용자 권한 마스크
      S_IROTH 0000004 기타 사용자 읽기 권한
      S_IWOTH 0000002 기타 사용자 쓰기 권한
      S_IXOTH 0000001 기타 사용자 실행 권한


    반환값

    성공 시 0 리턴

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

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[]) {
        char *fname1 = "ssu_file1";
        char *fname2 = "ssu_file2";
        struct stat statbuf;
    
        // ssu_file1 의 정보 수집
        if (stat(fname1, &statbuf) < 0) {
            fprintf(stderr, "%s stat error\n", fname1);
            exit(1);
        }
    
        // ssu_file1의 접근 권한을 기존 권한에서 그룹 실행 권한을 빼고, SetUid 권한을 추가
        if (chmod(fname1, (statbuf.st_mode & ~S_IXGRP) | S_ISUID) < 0) {
            fprintf(stderr, "%s chmode error\n", fname1);
            exit(1);
        }
    
        // ssu_file2의 접근 권한을 소유자 rwx, 그룹 r, 기타 사용자 r 권한으로 설정
        chmod(fname2, S_IRWXU | S_IRGRP | S_IROTH);
        exit(0);
    }
    

    결과

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    // 소유자, 그룹, 기타 사용자 실행 권한
    #define MODE_EXEC (S_IXUSR | S_IXGRP | S_IXOTH)
    
    int main(int argc, char *argv[]) {
        struct stat statbuf;
    
        for (int i = 1; i < argc; i++) {
            if (stat(argv[i], &statbuf) < 0) {
                fprintf(stderr, "%s stat error\n", argv[i]);
                continue;
            }
    
            // 기존 권한에 소유자, 그룹, 기타 사용자 실행 권한을 추가하고
            statbuf.st_mode |= MODE_EXEC;
    		
            // 그룹, 기타 사용자 실행 권한을 not 한다.
            // 따라서 그룹, 기타 사용자 실행 권한은 사라지게 된다.
            statbuf.st_mode ^= (S_IXGRP | S_IXOTH);
    		
            // 권한 수정
            if (chmod(argv[i], statbuf.st_mode) < 0) {
                fprintf(stderr, "%s chmod error\n", argv[i]);
                continue;
            }
    
            printf("%s : 권한 변경 완료\n", argv[i]);
        }
        exit(0);
    }
    

    결과

     

     

     

     

     

     

     

     

     

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

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

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ truncate(2) ftruncate(2)  (0) 2020.05.18
    C/C++ chown(2) fchown(2) lchown(2)  (0) 2020.05.18
    C/C++ umask(2)  (1) 2020.05.17
    C/C++ access(2)  (1) 2020.05.17
    C/C++ stat(2), lstat(2), fstat(2)  (0) 2020.05.17

    댓글

Designed by Tistory.