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 :
'C언어 header > sys | stat.h' 카테고리의 다른 글
mkdir(2) - directory 생성 (0) | 2019.10.04 |
---|---|
fchmod(2) - 파일의 접근 권한(permission) 변경 (0) | 2019.09.29 |
chmod(2) - 파일의 접근 권한(permission) 변경 (0) | 2019.09.29 |