Не работает umask

Странно работает umask, файла 123 не существует до выполнения программы(каждый раз удаляю), и получаю каждый раз разные флаги, что делаю не так?

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


int main(int c, char **v)  
{  
        int fd;  
        umask(0666);  
        fd = open("./123", O_CREAT);  
        close(fd);  
        return 0;  
}  
ls -la ./123
--ws-ws--T 1 fedor fedor 0 ноя 23 00:23 123

добавил с использованием 3 аргумента у open
теперь код выглядит так

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/stat.h>  
#include <sys/types.h>  
#include <fcntl.h>  
  
  
int main(int c, char **v)  
{  
        int fd;  
        umask(0666);  
        fd = open("./123", O_CREAT, 0666);  
        close(fd);  
        return 0;  
}  

вывод ls-a следующий

ls -la  
----------  1 fedor fedor     0 ноя 23 10:06 123

Ответы (2 шт):

Автор решения: avp

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

Вы 3-й аргумент (mode, т.е. rwx, на которые и воздействует umask) упустили, он обязателен при создании файла, а у вас его значение не определено, вот и меняется от запуска к запуску

→ Ссылка
Автор решения: AlexGlebe

umask - блокирует разрешения, а не даёт. В функцию open нужно добавить флаги O_RDONLY, O_WRONLY, или O_RDWR. А флаг O_TRUNC позволить этот файл очистить.

umask(0111);
fd = open("./123", O_CREAT|O_WRONLY|O_TRUNC, 0666 );

этот код с маской 0111 запретит разрешение исполнения и при открытия файла его обнулит.

→ Ссылка