Права доступа к файлам устанавливаются неправильно с помощью системного вызова open

В настоящее время я работаю над «Интерфейсом программирования Linux», и в главе 4 есть упражнение, в котором мы должны переписать команду «tee». Я сделал это, но независимо от того, что я делаю, мои права доступа к файлам (хранящиеся в переменной типа mode_t) не устанавливаются правильно.

то есть у меня есть этот код:

filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; // filePerms is mode_t
foutputFd = open((argc == 2) ? argv[1] : argv[2], flags, filePerms); // don't worry about the ternary here
if (foutputFd == -1)
  errExit("opening file %s", (argc == 2) ? argv[1] : argv[2]); // ...or here.

После того, как все сказано и сделано, файл в каталоге будет иметь права rw-r--r-- вместо rw-rw-rw, указанные выше флагами.

Теперь я провел некоторое исследование, и похоже, что аргумент mode, переданный в open(), указывает максимальное количество разрешенных разрешений, а затем он все равно изменяется позже (каким-то образом). Если это так, то почему это так? Зачем вообще позволять мне указывать разрешения в открытом вызове?

Любая помощь будет оценена по достоинству, я бы хотел продолжить эту книгу, но эта проблема немного расстраивает, лол (и я вообще не нашел объяснений в книге).


person LainIwakura    schedule 15.12.2013    source источник
comment
См. umask. Раздел 15.4.6   -  person Duck    schedule 16.12.2013
comment
Да, все говорят, что это умаск, я рад, что это будет объяснено позже в книге. Спасибо.   -  person LainIwakura    schedule 16.12.2013


Ответы (2)


Это изменение обычно вызывается настройкой umask. Если вы заранее настроили его в своей оболочке с помощью umask 0, этот код должен работать должным образом.

person randomusername    schedule 15.12.2013

Прежде всего проверьте, что вы передаете в аргументе flags. Любые права доступа к файлам будут иметь некоторый результат ТОЛЬКО при передаче флага O_CREAT.

Более того, эффективные права доступа к файлам являются результатом предоставленных флагов и значения umask как

mode & ~umask.

Проверьте, какой umask установлен в вашем случае, и вы, вероятно, получите ответ на свой вопрос. Более того, вы можете изменить umask с помощью системного вызова umask().

Для получения дополнительной информации вы можете прочитать, например, открыть справочную страницу.

person codewarrior    schedule 15.12.2013
comment
O_CREAT находится в переменной flags только в том случае, если мы не добавляем (программа допускает опцию -a, следовательно, тройной материал выше решает, что такое имя файла). Тем не менее, это похоже на проблему umask, интересно знать. Интересно, почему он был разработан именно так? - person LainIwakura; 16.12.2013