Intereting Posts
image.bmp с использованием qdbmp Использование случайных чисел с графическими процессорами Как читать пробел с помощью scanf в c? Коррумпированный указатель в связанном списке Как ограничить время выполнения функции в C / POSIX? Неопределенное поведение: при попытке получить доступ к результату вызова функции О безопасности streamов в malloc и бесплатной Сравнение битового поля против (отрицательного) целого числа, неопределенного поведения или ошибок компилятора? Странное поведение с параметрами функции и getch () В чем разница между ssize_t и ptrdiff_t? Как я могу предотвратить сканирование scanf () для ввода символа ввода? char array в structs – почему strlen () возвращает правильное значение здесь? Выделение памяти и ее освобождение. Должны ли мы установить их в NULL? Доступ к глобальной переменной по отношению к вызовам функций и их возврату Вклад Struct в размер шрифта

Как создать каталог с правообладателями с помощью C on Posix

Я пытаюсь написать простую программу на C, которая создает каталоги (клон mkdir.). Это то, что у меня есть до сих пор:

#include  #include  // mkdir #include  // perror mode_t getumask() { mode_t mask = umask(0); umask (mask); return mask; } int main(int argc, const char *argv[]) { mode_t mask = getumask(); printf("%i",mask); if (mkdir("trial",mask) == -1) { perror(argv[0]); exit(EXIT_FAILURE); } return 0; } 

Этот код создает каталог с d--------- но я хочу, чтобы он создавал его с помощью drwxr-xr-x как mkdir do? Что я здесь делаю неправильно?

Редактировать: Это рабочее решение для меня:

 int main(int argc, const char *argv[]) { if (mkdir("trial",0777) == -1) { perror(argv[0]); exit(EXIT_FAILURE); } return 0; } 

Установка правильных разрешений в соответствии с umask автоматически обрабатывается. Поэтому мне нужно было только позвонить mkdir с полными разрешениями, и он будет измельчен в соответствии с текущим umask.

    Как говорит Эрик, umask – это дополнение к реальному режиму разрешения, которое вы получаете. Поэтому вместо передачи маски в mkdir() вы должны передать 0777-mask в mkdir() .

    Кажется, вы неправильно понимаете, для чего используется umask . Он устанавливает / извлекает маску создания режима файла процесса, которая, в свою очередь, используется для отключения бит в режиме файла, который вы указываете в таких вызовах, как mkdir , например this (pseduo-code):

     real_mode = requested_mode & ~umask 

    Таким образом, в вашем коде, поскольку вы передаете значение самого umask, вы в конечном итоге указываете разрешения как ноль, и это именно то, что вы видите.

    Вместо этого вы должны указать разрешения, которые вы хотите в вызове mkdir , например:

     mkdir("trial", 0755)