C言語システムコール-umask

umaskシステムコール

概要

umaskはプロセスのumask値を指定した値に変更します。

umaskを実行すると、戻り値として現在のumask値を取得できます。


umask値は新規ファイル及びディレクトリや特殊ファイルなどを作成するシステムコール(openやmkdirなど)に影響します。

umask値が「027」の場合、0777のファイルを作成するとビット論理演算によって「0750」のパーミッションでファイルを作成します。

umask値はumaskコマンドで確認できます。


$ umask
0022
$ umask 27
$ umask
0027
$ umask 22
$ umask
0022

umask値はプロセス毎に保持している値であり、子プロセスがumask値を変更しても親プロセスのumask値は変更されません。


サンプルプログラム


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

static int
create_file(void)
{
    int fd = 0;
    char *path = "./tmp/memo1.txt";

    fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0666);
    if(fd < 0){
        printf("Error: open(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    if(close(fd) < 0){
        printf("Error: close(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(0);
}

int
main(void)
{
    mode_t um = {0};

    um = umask(27);
    printf("umask = %03o\n", (int)um);

    if(create_file() != 0) return(-1);
    umask(um);

    return(0);
}

関連ページ