C & LINUX

C / LINUX chmod(2) fchmod(2)

Ocean_ 2022. 5. 2. 15:08

함수 기능

파일의 접근 권한을 변경하는 함수

함수 원형

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

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

함수 파라메터

filepath

파일의 경로이름

mode

umask의 cmask와 동일

함수 예제

chmod1

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>

int main(void){
    struct stat statbuf;
    char *fname1 = "ssu_file1";
    char *fname2 = "ssu_file2";

    if(stat(fname1,&statbuf)<0){
        fprintf(stderr,"stat error %s\n",fname1);
    }
    if(chmod(fname1,(statbuf.st_mode & ~S_IXGRP) | S_ISUID)<0)
        fprintf(stderr,"chmod error %s\n",fname1);

    if(chmod(fname2,S_IRUSR |S_IWUSR|S_IRGRP|S_IROTH|S_IXOTH)<0)
        fprintf(stderr,"chmod error %s\n",fname2);

    exit(0);
}

chmod2

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>

#define MODE_EXEC (S_IXUSR|S_IXGRP|S_IXOTH)

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

    struct stat statbuf;
    int i;

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

    for(i=1; i<argc; i++){
        if(stat(argv[i],&statbuf)<0){
            fprintf(stderr, "%s : chmod error\n",argv[i]);
            continue;
        }

        statbuf.st_mode |= MODE_EXEC;
        statbuf.st_mode ^= (S_IXGRP|S_IXOTH);
        if(chmod(argv[i],statbuf.st_mode)<0)
            fprintf(stderr, "%s : chmod error\n",argv[i]);
        else
            printf("%s : file permission was changed.\n",argv[i]);
    }
    
    exit(0);
}

함수 결과

 

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

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