Странное поведение от созданного системного вызова

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

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

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

-rwxr-xr-x

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

drwxrwxrwx

Умаск

0022

Ребята подскажите что может быть не так?

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


person Ricko M    schedule 13.05.2011    source источник


Ответы (4)


Разрешения в umask отключаются из аргумента режима на 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)

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

person Michael Foukarakis    schedule 13.05.2011

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

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

person bitmask    schedule 13.05.2011

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

man umask

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

person sehe    schedule 13.05.2011

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

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

person Omnifarious    schedule 13.05.2011
comment
@Ricko M: Пожалуйста. Совет... вам следует подождать некоторое время, прежде чем принять ответ. Первый человек, который дает наполовину достойный ответ, не всегда тот, кто дает лучший ответ. Я не говорю, что мой лучше. Это вам судить. Но если вы согласитесь в течение 5 минут, вы можете упустить лучший ответ. - person Omnifarious; 13.05.2011