Странное поведение от системного вызова Creat - PullRequest
1 голос
/ 13 мая 2011

Я создаю файл следующим образом

 int fd  = creat(file_path.c_str() ,S_IRWXU|S_IRWXG|S_IRWXO);

Хотя я предоставляю все разрешения всем трем объектам, он создает файлы с указанным ниже разрешением.

-rwxr-xr-x

Каталогя создаю это в имеет разрешения, установленные как

drwxrwxrwx

Umask

0022

Можете ли вы, ребята, предложить, что может быть не так?

Редактировать: я могу chmod файл, чтобы дать ему разрешения, которые я планирую.Мне любопытно, почему вышеупомянутое терпит неудачу.

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Вы сказали это сами, у вас есть umask 022, поэтому разрешение на запись опущено;Со страницы создания man:

Действующие разрешения изменяются с помощью umask процесса обычным способом: разрешения создаваемого файла (mode & ~ umask).

3 голосов
/ 13 мая 2011

Umask объединяется с правами доступа к файлам, которые вы указываете в вызове creat таким образом file_perms & ~umask, чтобы получить биты прав доступа, которые фактически установлены для файла.Umask в основном указывает, какие биты не должны быть установлены, даже если вы запрашиваете их установку.

Вызов chmod игнорирует umask.И ваши права доступа к каталогу здесь не имеют значения (ну, не совсем не имеют значения, он полностью потерпит неудачу, если у вас не будет разрешения на запись в каталог, в котором вы создаете файл).

3 голосов
/ 13 мая 2011

Вы, вероятно, работаете с ограничением umask

man umask

должно вывести вас на правильный путь

1 голос
/ 13 мая 2011

Разрешения в umask отключаются от аргумента mode до open и mkdircreat и друзей, аналогично).Например, если аргумент mode указан как:

S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666) при создании файла с типичным значением umask 0022, результат будет

S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH (0644)

Итак, вы правильно видите, что права на запись не предоставляются для создаваемого вами каталога.

...