Не работает 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 шт):
man 2 open -- int open(const char *pathname, int flags, mode_t mode);
Вы 3-й аргумент (mode, т.е. rwx, на которые и воздействует umask) упустили, он обязателен при создании файла, а у вас его значение не определено, вот и меняется от запуска к запуску
umask - блокирует разрешения, а не даёт. В функцию open нужно добавить флаги O_RDONLY, O_WRONLY, или O_RDWR. А флаг O_TRUNC позволить этот файл очистить.
umask(0111);
fd = open("./123", O_CREAT|O_WRONLY|O_TRUNC, 0666 );
этот код с маской 0111 запретит разрешение исполнения и при открытия файла его обнулит.