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

#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)

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