umask(2)

#include <sys/types.h>
#include <sys/stat.h>

mode_t umask(mode_t mask);

umask(2)는 open(2), creat(2), mkdir(2) 등과 같이 파일 또는 디렉토리가 생성될 때에 불필요하게 많은 권한을 갖지 않도록 통제하는 함수입니다.

int open(const char *pathname, int flags, mode_t mode);

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

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

이 함수들의 파리미터인 mode에 대해서 (mode & ~umask & 0777)와 같은 bit 연산의 결과로 파일 또는 directory의 권한이 부여됩니다.

 

만약, mode의 값이 0666으로 파일을 생성한다고 해도, umask의 값이 022이면 (0666 & ~022 & 0777)로 되어 0644의 권한으로 파일 또는 디렉토리가 생성됩니다.

즉, rw-rw-rw-로 파일의 권한을 주려고 mode를 설정하여도 umask의 값이 ----w--w-이면 umask의 값을 빼라는 의미가 되어

생성되는 파일의 권한은 rw-r--r--을 갖게 됩니다.

     mode  : rw-rw-rw-
 - ) umask : ----w--w-
   --------------------
     결과  : rw-r--r--

또한 POSIX IPC인 mq_open(3), sem_open(3), shm_open(3)에도 영향을 줍니다.

umask(2)로 설정된 umask값은 fork(2), execl계열함수들에도 상속이 됩니다.

 

그러나 umask는 생성하는 함수가 아닌 chmod(2), fchmod(2)에는 영향을 주지 않습니다.

System V IPC인 msgget(2), semget(2), shmget(2)에는 영향을 주지 않습니다.

 

 

파라미터

mask
    -  새롭게 변경할 umask값.

 

RETURN

0 이상
    - 기존에 설정된 umask값. 
    - umask(2)는 오류가 발생하지 않습니다.

 


활용 예제

 

Sample

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    mode_t  old;
    int     fd;

    // 파일의 권한을 반드시 0666으로 설정하고 싶을 경우 umask를 0으로 설정함
    old = umask(0);
    
    if((fd = open(argv[1], O_CREAT | O_RDWR, 0666)) == -1) {
        fprintf(stderr, "%s file open error: %s\n", argv[1], strerror(errno))
        return 1;
    }

    // 파일 생성후에 원래의 umask로 원복함.

    umask(old);

}

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요