#c #c #unix #system-calls
#c #c #unix #системные вызовы
Вопрос:
Я создаю файл следующим образом
int fd = creat(file_path.c_str() ,S_IRWXU|S_IRWXG|S_IRWXO);
Хотя я предоставляю все разрешения для всех трех объектов, он создает файлы с указанным ниже разрешением.
-rwxr-xr-x
Каталог, в котором я это создаю, имеет разрешения, установленные как
drwxrwxrwx
Umask
0022
Ребята, пожалуйста, не могли бы вы подсказать, что может быть не так?
Редактировать: я могу изменить файл, чтобы предоставить ему разрешения, которые я планирую. Мне любопытно, почему вышеприведенный сбой.
Ответ №1:
Вы сами сказали, что у вас есть umask 022, поэтому разрешение на запись отсутствует; Со страницы руководства по созданию:
Действующие разрешения изменяются umask процесса обычным способом: разрешениями для созданного файла являются (mode amp; ~umask).
Ответ №2:
Скорее всего, вы работаете под ограничением umask
man umask
должно вывести вас на правильный путь
Ответ №3:
Umask комбинируется с правами доступа к файлам, которые вы указываете в creat
вызове таким образом file_perms amp; ~umask
, чтобы получить биты разрешений, которые фактически установлены для файла. Umask в основном определяет, какие биты не следует устанавливать, даже если вы запрашиваете их установку.
chmod
Вызов игнорирует umask. И ваши разрешения для каталога здесь неуместны (ну, не совсем неуместны, это привело бы к полному сбою, если бы у вас не было разрешения на запись в каталог, в котором вы создаете файл).
Комментарии:
1. @Ricko M: Всегда пожалуйста. Небольшой совет… вам следует подождать некоторое время, прежде чем принимать ответ. Первый, кто дает наполовину достойный ответ, не всегда тот, кто дает лучший ответ. Я не говорю, что мой лучше. Это вам судить. Но если вы примете в течение 5 минут, вы можете упустить лучший ответ.
Ответ №4:
Разрешения в umask отключены из аргумента mode для open
и mkdir
(и creat
и друзья, аналогично). Например, если 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)
Итак, вы правильно видите, что доступ на запись не предоставляется создаваемому вами каталогу.